.NET:Как изменить значение в DataTable
-
06-07-2019 - |
Вопрос
В ADO.NET я использую Становится доступным чтобы вернуть таблицу схемы для набора результатов.
DataTable schema = rdr.GetSchemaTable();
gridSchema.DataSource = schema;
gridSchema.DataBind();
К сожалению , "ProviderType" (Тип поставщика) значение отображается в виде целого числа, а не OleDbType ( 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 ( 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,
}
я хочу отображать тип данных как нечто удобочитаемое человеком, а не как целое число.
я попытался прокрутить схему 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.
я даже посмотрел на экран 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();
Решение
Возможно, я здесь совершенно не прав, но не могли бы вы просто установить для свойства столбца только для чтения значение false?Нравится:
schema.Columns["ProviderType"].ReadOnly = false;
Впоследствии у вас может возникнуть проблема с типом столбца, поскольку вы пытаетесь поместить строковое значение в столбец integer.Но это должно направить вас в правильном направлении.
Редактировать:
Решение проблемы с типом столбца:
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 и другие также принимают массивы объектов в качестве источников данных, поэтому это происходит автоматически.