سؤال

لذلك ، ربما هذا تصميم سيء. لا أعلم. لكن قل لدي DataTable مع عمود يحمل int القيم؛ هذه القيم تهدف في الواقع إلى تمثيل بعض enum اكتب ما لدي في مشروعي.

ما أود القيام به هو الحصول على ملف DataGridView ملزمة لهذا الجدول واطلب من العمود عرض اسم enum بدلاً من قيمة عدد صحيح "0" أو "1" أو أي شيء آخر.

أحد الخيارات التي فكرت فيها هو القيام بكل شيء تطبيع كامل: أضف جدولًا في DataSet مع ال enum أسماء في ذلك ، مفتاح على enum القيم ، ولدي الجدول الأول لي إشارة إلى هذه الطاولة.

لكن هذا هو enumفكرة محددة. أود أن أعرف ما إذا كان يمكنني ، بشكل عام ، كتابة بلدي IFormatProvider و ICustomFormatter التنفيذ* لنوع معين واستخدم هذا التنسيق للتحكم في كيفية عرض القيم في عمود معين من أ DataGridView السيطرة (أو حقا في أي السيطرة ، لهذه المسألة).

*هذه هي الطريقة التي أظن أنها ستتم ، إذا كان ما أطلبه ممكنًا على الإطلاق. أنا لست ميتًا حقًا على استخدام هذه الواجهات على الإطلاق.

هل كانت مفيدة؟

المحلول

يمكنك بالفعل تنفيذ العرف ICustomFormatter, ، ولكن بسبب بعض التخلف من جانب DataGridView, ، عليك أن تخبرها فعليًا بكيفية تطبيق التنسيق الخاص بك.

المجموعة الأولى column.DefaultCellStyle.FormatProvider إلى مثيل من فئة التنسيق المخصصة. ثم تعامل مع CellFormatting حدث:

void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
    if (e.CellStyle.FormatProvider is ICustomFormatter) {
        e.Value = (e.CellStyle.FormatProvider.GetFormat(typeof(ICustomFormatter)) as ICustomFormatter).Format(e.CellStyle.Format, e.Value, e.CellStyle.FormatProvider);
        e.FormattingApplied = true;
    }
}

ستبدو الطبقة الصالحة مثل هذا:

public class MyEnumFormatter : IFormatProvider, ICustomFormatter {

    public object GetFormat(Type formatType) {
        if (formatType == typeof(ICustomFormatter))
            return this;
        else
            return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider) {
        return ((NameOfEnumType)Convert.ToInt32(arg)).ToString();
    }

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