باستخدام تنسيق مخصص في DataGridView
-
30-09-2019 - |
سؤال
لذلك ، ربما هذا تصميم سيء. لا أعلم. لكن قل لدي 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();
}
}