.NET:DataTableの値を変更する方法
-
06-07-2019 - |
質問
ADO.NETで GetSchemaTable を使用して、結果セットのスキーマテーブルを返します。
DataTable schema = rdr.GetSchemaTable();
gridSchema.DataSource = schema;
gridSchema.DataBind();
残念ながら、" ProviderType" の値は、 OleDbType 列挙値:
ProviderType Desired Display Value
============ =====================
129 Char
3 Integer
129 Char
129 Char
3 Integer
3 Integer
129 Char
135 DBTimeStamp
129 Char
129 Char
...
これらの整数はすべて、 OleDbType 列挙:
public enum OleDbType
{
Empty = 0,
SmallInt = 2,
Integer = 3,
Single = 4,
Double = 5,
Currency = 6,
Date = 7,
BSTR = 8,
IDispatch = 9,
Error = 10,
Boolean = 11,
Variant = 12,
IUnknown = 13,
Decimal = 14,
TinyInt = 16,
UnsignedTinyInt = 17,
UnsignedSmallInt = 18,
UnsignedInt = 19,
BigInt = 20,
UnsignedBigInt = 21,
Filetime = 64,
Guid = 72,
Binary = 128,
Char = 129,
WChar = 130,
Numeric = 131,
DBDate = 133,
DBTime = 134,
DBTimeStamp = 135,
PropVariant = 138,
VarNumeric = 139,
VarChar = 200,
LongVarChar = 201,
VarWChar = 202,
LongVarWChar = 203,
VarBinary = 204,
LongVarBinary = 205,
}
iデータ型を整数ではなく人間が読める形式で表示したい。
スキーマDataTableをループして、DataTable内の値を変更しようとしました:
DataTable schema = rdr.GetSchemaTable();
//Change providerType column to be readable
foreach (DataRow row in schema.Rows)
{
OleDbType t = (OleDbType)row["ProviderType"];
row["ProviderType"] = t.ToString();
}
gridSchema.DataSource = schema;
gridSchema.DataBind();
ただし、例外がスローされます:
Column 'ProviderType' is read only.
iは、GridViewの RowDataBound イベント、レンダリングされるときに値を変更できると考えています:
protected void gridSchema_RowDataBound(object sender, GridViewRowEventArgs e)
{
//todo: magic
//e.Row["ProviderType"]
}
しかし、レンダリングされた値で遊ぶことができるようには見えません。
ProviderType 列の値を使用して、人間に表示するときに人間が読めるようにする方法を提案できますか?
更新
現在使用している回避策は、最後に余分な列を追加することです:
DataTable schema = rdr.GetSchemaTable();
schema.Columns.Add("OleDbDataType", typeof(String));
schema.Columns.Add("CLRDataType", typeof(String));
foreach (DataRow row in schema.Rows)
{
//Show the actual provider type
OleDbType t = (OleDbType)row["ProviderType"];
row["OleDbDataType"] = t.ToString();
//Show the corresponding CLR type while we're doing a hack
row["CLRDataType"] = row["DataType"].ToString();
}
gridSchema.DataSource = schema;
gridSchema.DataBind();
解決
ここでは完全にオフになっているかもしれませんが、列のReadOnlyプロパティをfalseに設定することはできませんか?いいね:
schema.Columns["ProviderType"].ReadOnly = false;
その後、文字列値を整数列に入れようとしているときに列タイプの問題が発生する可能性があります。しかし、これにより正しい方向に進むはずです。
編集:
columntypeの問題の解決:
DataTable newTable = schema.Clone();
newTable.Columns["ProviderType"].DataType = typeof(string);
foreach (DataRow dr in schema.Rows)
{
DataRow newRow = newTable.NewRow();
// fill newRow with correct data and newly formatted providertype
newTable.Rows.Add(newRow);
}
他のヒント
または、データテーブルのすべてのフィールドを持つオブジェクトを作成し、すべてのデータをオブジェクトに渡して変更するか、指定された整数に一致する文字列を返す読み取り専用フィールドを作成できます。
GridViewなどは、オブジェクト配列をデータソースとして受け入れるため、自動です。
所属していません StackOverflow