سؤال

في ADO.NET أستخدم GetSchemaTable لإرجاع جدول المخطط لمجموعة النتائج.

DataTable schema = rdr.GetSchemaTable();
gridSchema.DataSource = schema;
gridSchema.DataBind();

لسوء الحظ "نوع الموفر" يتم عرض القيمة كعدد صحيح، بدلاً من 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"]
}

لكن لا يبدو أنه يمكنك اللعب بالقيم المعروضة.

يمكن لأي شخص أن يقترح طريقة لطيفة للكثير من قيمة نوع الموفر العمود بحيث يكون قابلاً للقراءة من قبل الإنسان عندما أعرضه على البشر؟


تحديث

الحل البديل الذي أستخدمه الآن هو إضافة عمود إضافي في النهاية:

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();
هل كانت مفيدة؟

المحلول

ربما أكون متوقفًا تمامًا عن العمل هنا، لكن ألا يمكنك تعيين خاصية القراءة فقط للعمود على "خطأ"؟يحب:

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);
}

نصائح أخرى

أو يمكنك إنشاء كائن بجميع الحقول من جدول البيانات، وتمرير كافة البيانات إلى الكائن الخاص بك وتعديله أو إنشاء حقل للقراءة فقط يُرجع السلسلة وفقًا للعدد الصحيح المعطى.

يقبل GridView وغيره أيضًا صفائف الكائنات كمصادر بيانات، لذا فهي تلقائية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top