public object[] ItemArray { get; set; }
以 物件陣列 形式一次性取得或設定該列所有欄位值。索引順序對應 DataTable.Columns 集合順序。
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Price", typeof(decimal));
// 新增列並用 ItemArray 一次設定
DataRow row = dt.NewRow();
row.ItemArray = new object[] { 1, "Apple", 10.5m };
dt.Rows.Add(row);
// 讀取
object[] values = row.ItemArray;
Console.WriteLine($"Id={values[0]}, Name={values[1]}, Price={values[2]}");
// 輸出: Id=1, Name=Apple, Price=10.5
// 從來源表複製到目標表 (結構相同)
foreach (DataRow srcRow in sourceTable.Rows)
{
DataRow destRow = destTable.NewRow();
destRow.ItemArray = srcRow.ItemArray; // 一次複製所有欄位
destTable.Rows.Add(destRow);
}
| 項目 | 說明 |
|---|---|
| 陣列長度 | 設定時長度必須 ≤ 欄位數,否則拋 ArgumentException。 |
| 唯讀欄位 | 若欄位 ReadOnly=true 且列非新增狀態,設定會拋例外。 |
| 自動遞增欄位 | 設定 null 或 DBNull.Value 可觸發自動產生值。 |
| 型別轉換 | 會嘗試隱含轉換,失敗拋 InvalidCastException。 |
| DBNull 處理 | 設定 null 會自動轉為 DBNull.Value (實值型別欄位不可為 null)。 |
| 事件觸發 | 設定過程會觸發 ColumnChanging/ColumnChanged 事件。 |
public object[] ItemArray
{
get
{
int record = this.GetDefaultRecord(); // 取得目前記錄索引 (Current/Proposed/Original)
object[] arr = new object[this._columns.Count];
for (int i = 0; i < arr.Length; i++)
arr[i] = this._columns[i][record]; // 直接存取 DataColumn 內部儲存
return arr;
}
}
set
{
if (value == null) throw new ArgumentNullException(nameof(ItemArray));
if (this._columns.Count < value.Length) throw new ArgumentException("陣列長度超過欄位數");
var editBegun = this.BeginEditInternal(); // 確保進入編輯模式
var changeEvent = this._table.NeedColumnChangeEvents ? new DataColumnChangeEventArgs(this) : null;
for (int i = 0; i < value.Length; i++)
{
if (value[i] != null)
{
var col = this._columns[i];
// 唯讀檢查、事件觸發、型別驗證、DBNull 轉換...
int proposed = this.GetProposedRecordNo();
col[proposed] = value[i] ?? (col.IsValueType ? throw new Exception() : DBNull.Value);
this.LastChangedColumn = col;
}
}
this.EndEdit(); // 結束編輯,認可變更
}
row[i] 或 row["ColName"]。ItemArray 批次複製比逐欄位約快 15-20%。
圖示:設定陣列長度超過欄位數時拋出 ArgumentException: Value array length exceeds column count。
原文連結:https://www.bianceng.cn/Programming/csharp/201410/45585.htm