كيف يمكنك الحصول على اسم التعيين المناسب من مصدر ربط مرتبط بقائمة<T>، أو نوع مجهول، لاستخدامه في DataGridTableStyle؟

StackOverflow https://stackoverflow.com/questions/420386

سؤال

أحاول إنشاء كائن DataGridTableStyle حتى أتمكن من التحكم في عرض الأعمدة في DataGrid.لقد قمت بإنشاء كائن BindingSource منضمًا إلى القائمة.في الواقع، إنها مرتبطة بقائمة أنواع مجهولة تم إنشاؤها من خلال Linq بالطريقة التالية (تم تغيير أسماء المتغيرات لتوضيح ما أفعله):

List<myType> myList = new List<myType>(someCapacity);
.
...populate the list with query from database...
.

var query = from i in myList
            select new
            {
                i.FieldA,
                i.FieldB,
                i.FieldC
            };

myBindingSource.DataSource = query;
myDataGrid.DataSource = myBindingSource;

ثم أقوم بإنشاء كائن DataGridTableStyle وإضافته إلى datagrid.ومع ذلك، فإنه لا يطبق أبدًا خصائص نمط الجدول التي قمت بإعدادها لأنه لا يبدو أنني قمت بتعيين خاصية myDataGridTableStyle.MappingName المناسبة.

لقد بحثت في Google لمدة نصف ساعة تقريبًا واستمر في رؤية روابط لنفس السؤال عبر مجموعة من المنتديات المختلفة (حرفيًا نفس النص، مثل قيام شخص ما بنسخ السؤال ولصقه للتو ...أنا أكره ذلك...).على أية حال، لم ينجح أي من الاقتراحات، تمامًا كما يقول الرجل في جميع المواقع الأخرى.

فهل يعرف أي شخص هنا ما الذي أحتاجه لتعيين خاصية MappingName لكي يعمل TableStyle الخاص بي بشكل صحيح؟ومن أين أستطيع أخذ الاسم؟(لا يمكن أن يكون فارغا...الذي يعمل فقط مع BindingSource المرتبط بـ DataTable أو SqlCeResultSet وما إلى ذلك).

أعتقد أنه قد يكون هناك مشكلة في استخدام Linq لإنشاء نسخة مجهولة وأكثر تخصصًا من الكائنات مع الحقول التي أحتاجها فقط.هل يجب أن أحاول ربط BindingSource مباشرةً بكائن القائمة؟أو ربما ربط DataGrid مباشرةً بكائن القائمة وتخطي مصدر الربط تمامًا.

شكرًا

PS - C#، الإصدار المضغوط 3.5

تحديث:

لقد قمت بنشر إجابة أدناه التي حلت مشكلتي.سواء كان هذا هو النهج الأفضل أم لا، فقد نجح.يستحق نظرة خاطفة إذا كنت تواجه نفس المشكلة التي أواجهها.

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

المحلول

لقد وجدت طريقة لإنجاح هذا العمل.سأقسمها إلى أجزاء...


List<myType> myList = new List<myType>(someCapacity);
.
...populate the list with query from database...
.

DataGridTableStyle myDataGridTableStyle = new DatGridtTableStyle();
DataGridTextBoxColumn colA = new DataGridTextBoxColumn();
DataGridTextBoxColumn colB = new DataGridTextBoxColumn();
DataGridTextBoxColumn colC = new DataGridTextBoxColumn();

colA.MappingName = "FieldA";
colA.HeaderText = "Field A";
colA.Width = 50; // or whatever;

colB.MappingName = "FieldB";
.
... etc. (lather, rinse, repeat for each column I want)
.

myDataGridTableStyle.GridColumnStyles.Add(colA);
myDataGridTableStyle.GridColumnStyles.Add(colB);
myDataGridTableStyle.GridColumnStyles.Add(colC);

var query = from i in myList
            select new
            {
                i.FieldA,
                i.FieldB,
                i.FieldC
            };

myBindingSource.DataSource = query.ToList(); // Thanks Marc Gravell

// wasn't sure what else to pass in here, but null worked.
myDataGridTableStyle.MappingName = myBindingSource.GetListName(null); 

myDataGrid.TableStyles.Clear(); // Recommended on MSDN in the code examples.
myDataGrid.TablesStyles.Add(myDataGridTableStyle);
myDataGrid.DataSource = myBindingSource;

لذلك، يحتاج DataGridTableStyle.MappingName بشكل أساسي إلى معرفة نوع الكائن الذي يتم تعيينه إليه.نظرًا لأن الكائن الخاص بي هو نوع مجهول (تم إنشاؤه باستخدام Linq)، فلا أعرف ما هو حتى وقت التشغيل.بعد أن أقوم بربط قائمة النوع المجهول بمصدر الربط، يمكنني استخدام BindingSource.GetListName(null) للحصول على تمثيل السلسلة للنوع المجهول.

شيء واحد يجب ملاحظته.إذا قمت للتو بربط myList (الذي هو نوع "myType") مباشرةً بمصدر الربط، فقد يكون بإمكاني استخدام السلسلة "myType" كقيمة لـ DataGridTableStyle.MappingName.

نأمل أن يكون هذا مفيدا لأشخاص آخرين!

نصائح أخرى

وفقط لإضافة إلى مجموعة من الإجابات بالفعل في هذه الصفحة ....

ولقد كنت محبط مع هذه المسألة نفسها تحاول تطوير طلبي قبضة باستخدام أشكال النوافذ والإطار المضغوط (ويندوز موبايل 6.5).

وماذا اكتشفت، من خلال تعليق مارك Gravell وسبق هو أن الواقع هو ممكن للحصول على MappingName وقت التشغيل فحص خصائص في DataGrid. القيام بذلك وجدت أن عند الربط بلدي List<MyType> مباشرة إلى الخاصية DataSource لفي DataGrid، في DataGrid كان يبحث فعلا لDataGridTableStyle مع MappingName من

"List`1"

وبدلا من أي مزيج من List<MyType> أو MyType ...

وهكذا ... وذلك بوضع "List`1" في اسم التعيين على محرر مجموعة DataGridTableStyle (في وقت التصميم)، وكنت قادرا على تخصيص الأعمدة وغيرها من الممتلكات دون الحاجة إلى إنشاء كل منهم في وقت التشغيل.

وآمل فقط وهذا يضيف بعض أكثر إلى الأجوبة التي سبق تقديمها. شكرا لكم جميعا على توفير لي مع المبادئ التوجيهية.

والاستعلام بإرجاع IEnumerable<T> لبعض T، ولكن أكثر المصادر ملزمة (باستثناء ASP.NET) تتطلب IList (مثل أي تطبيق IList<T>) - حاول إضافة .ToList() - أي بمعنى

myBindingSource.DataSource = query.ToList();

وA BindingList<T> قد عمل أفضل (إذا كانت مدعومة من في CF 3.5) لأنه لديه دعم أفضل لبعض السيناريوهات ملزمة المشتركة؛ إذا كنت بحاجة إلى هذا (وجود افتراض BindingList<T> على CF 3.5)، يمكنك إضافة وسيلة التمديد:

static BindingList<T> ToBindingList<T>(this IEnumerable<T> data)
{
    return new BindingList<T>(new List<T>(data));
}

وبعد ذلك الاتصال على:

myBindingSource.DataSource = query.ToBindingList();

لاكتمال، بديلا عن IList هو IListSource (أو حتى Type لسيناريوهات بحتة الفوقية)، والذي هو السبب في كتابة DataSource باسم object. اذا لم يكن لهذه المشكلة، ومترجم ربما كان يمكن أن يكون قادرا على ان اقول لك المشكلة (أي إذا تم تعريف DataSource كما IList).

وتابعت هذه الإجابة، ووجدت أن MappingName جاء دائما إلى أن تكون اسم الفئة الأساسية (myType في المثال).

وهكذا يبدو أن وضع مجموعة من خلال BindingSource يحل المشكلة على أي حال، وأن هناك ثم لا حاجة لBindingSource.GetListName (خالية).

وأيضا وجدت حاجة لToList () الاستعلام باسم BindingSource أيضا أن تفعل هذا بالنسبة لك.

وشكرا جزيلا لجايسون أسفل لوضع لي على الطريق الصحيح.

وكنت أواجه نفس المشكلة لتحديد عرض العمود. بعد الكثير من R & D، لقد غيرت كود النحو المبين أدناه وغرامة العاملة. الرمز:

DataGridTableStyle tableStyle = new DataGridTableStyle();
tableStyle.MappingName = dgCustom.DataSource.GetType().Name;

وحيث dgCustom غير معرف DataGrid في dgCustom.DataSource.GetType().Name التي تعمل تماما.

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