.NET: Wie man den Wert in einer Datatable ändern
-
06-07-2019 - |
Frage
In ADO.NET ich verwende GetSchemaTable setzen Sie die Schematabelle für ein Ergebnis zurückzukehren.
DataTable schema = rdr.GetSchemaTable();
gridSchema.DataSource = schema;
gridSchema.DataBind();
Unfortunatly der "Provider" Wert wird als ganze Zahl anzeigt, anstatt die OleDbType Enumerationswerts dass es ist:
ProviderType Desired Display Value
============ =====================
129 Char
3 Integer
129 Char
129 Char
3 Integer
3 Integer
129 Char
135 DBTimeStamp
129 Char
129 Char
...
Alle diese ganzen Zahlen die die Aufzählungswerte für die OleDbType Aufzählung:
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,
}
Ich möchte den Datentyp als etwas vom Menschen lesbaren und nicht angezeigt werden als eine ganze Zahl ist.
Ich habe durch das Schema Datatable versucht, Looping und die Werte innerhalb des Datatable ändern:
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();
Aber das löst eine Ausnahme:
Column 'ProviderType' is read only.
i auch bei der Gridview der RowDataBound Ereignis, dachte ich den Wert ändern könnte, wie es gemacht wird:
protected void gridSchema_RowDataBound(object sender, GridViewRowEventArgs e)
{
//todo: magic
//e.Row["ProviderType"]
}
Aber es sieht nicht wie Sie mit gerenderten Werte spielen können.
Kann ich jemand eine nette Art und Weise zu viel vorschlägt mit dem Wert der Provider Spalte, so dass es menschlich lesbar ist, wenn ich es für die Menschen darstellen?
Update
Die Abhilfe i gerade jetzt habe, ist eine zusätzliche Spalte am Ende heften:
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();
Lösung
Ich könnte ganz aus seiner hier, aber können Sie nicht nur die Readonly-Eigenschaft der Spalte auf false gesetzt? Wie:
schema.Columns["ProviderType"].ReadOnly = false;
Danach können Sie ein Column Problem zu bekommen, wie Sie einen String-Wert in eine Integer-Spalte zu setzen versuchen. Aber das sollten Sie in die richtige Richtung.
Bearbeiten
Die Lösung der Column Ausgabe:
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);
}
Andere Tipps
Oder Sie könnten ein Objekt mit allen Feldern aus der Datentabelle, übergeben Sie all Daten in Ihr Objekt erstellen und ändern oder ein Nur-Lese-Feld erstellen, die die Zeichenfolge Acording gegeben auf die ganze Zahl zurückzugibt.
Gridview und andere auch Objekt-Arrays als Datenquellen akzeptieren, so dass es automatisch.