.NET: Как изменить значение в DataTable - PullRequest
0 голосов
/ 23 июня 2009

В 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,
}

Я хочу отобразить тип данных как нечто понятное человеку, а не как целое число.


Я попытался перебрать схему 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();

Ответы [ 2 ]

2 голосов
/ 23 июня 2009

Я мог бы быть полностью отключен, но вы не можете просто установить для свойства ReadOnly столбца значение false? Как:

schema.Columns["ProviderType"].ReadOnly = false;

После этого у вас может возникнуть проблема с типом столбца, когда вы пытаетесь поместить строковое значение в целочисленный столбец. Но это должно привести вас в правильном направлении.

редактирование:

Решение проблемы с типом столбца:

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);
}
0 голосов
/ 29 января 2010

Или вы можете создать объект со всеми полями из таблицы данных, передать все данные в ваш объект и изменить его или создать поле только для чтения, которое возвращает строку в соответствии с заданным целым числом.

GridView и другие также принимают объектные массивы в качестве источников данных, поэтому он является автоматическим.

...