ربط كائن بكائنات فرعية كخصائص إلى بيانات البيانات
-
03-07-2019 - |
سؤال
أنا أعمل مع كائن يحتوي على كائنات فرعية داخل (انظر المثال أدناه). أنا أحاول ربط أ List<rootClass>
إلى DataGrid. عندما أربط List<>
, ، في الخلية التي تحتوي على subObject
, ، أرى القيمة التالية ... "namespace.subObject" ...
يتم عرض قيم السلسلة بشكل صحيح.
من الناحية المثالية ، أود أن أرى خاصية "الوصف" من subObject
في Datacell. كيف يمكنني تعيين ملف subObject.Description
لإظهار في داتاسيل؟
public class subObject
{
int id;
string description;
public string Description
{ get { return description; } }
}
public class rootClass
{
string value1;
subObject value2;
string value3;
public string Value1
{ get { return value1; } }
public subObject Value2
{ get { return value2; } }
public string Value3
{ get { return value3; } }
}
المحلول
إذا لم أكن مخطئًا ، فهذا يوضح نتيجة الاتصال. toString () على المشروع الفرعي الخاص بك ، حتى تتمكن من تجاوز ذلك لإعادة محتويات الوصف.
هل حاولت فقط الربط إلى Value1.description؟ (أظن أنه لا يعمل).
لدي فئة يمكن استخدامها بدلاً من القائمة عند الربط ، والتي ستتعامل مع هذا ، فإنه ينفذ itypedlist ، والذي يسمح للمجموعة بتوفير المزيد من "الخصائص" لكائناتها ، بما في ذلك الخصائص المحسوبة.
الإصدار الأخير من الملفات لدي هنا:
https://gist.github.com/lassevk/64ecea836116882a5d59b0f235858044
ليستخدم:
List<rootClass> yourList = ...
TypedListWrapper<rootClass> bindableList = new TypedListWrapper<rootClass>(yourList);
bindableList.BindableProperties = "Value1;Value2.Description;Value3.Description";
gridView1.DataSource = bindableList;
في الأساس ترتبط بمثيل TypedList<T>
بدلاً من List<T>
, ، وضبط خاصية prindableproperties. لدي بعض التغييرات في العمل ، بما في ذلك تلك التي تبني فقط pringableperties تلقائيًا كما تذهب ، لكنها ليست في الجذع حتى الآن.
يمكنك أيضًا إضافة خصائص محسوبة ، مثل هذا:
yourList.AddCalculatedProperty<Int32>("DescriptionLength",
delegate(rootClass rc)
{
return rc.Value2.Description.Length;
});
أو مع .NET 3.5:
yourList.AddCalculatedProperty<Int32>("DescriptionLength",
rc => rc.Value2.Description.Length);
نصائح أخرى
منذ أن ذكرت DataGridViewColumn
(علامات) ، أفترض أنك تعني winforms.
الوصول إلى الأعمدة الفرعية هو ألم. يرتبط مدير العملة بالقائمة ، لذلك يمكنك الوصول إلى العقارات الفورية بشكل افتراضي فقط ؛ ومع ذلك ، يمكنك تجاوز هذا إذا كنت بحاجة تماما باستخدام واصف نوع مخصص. ستحتاج إلى استخدام رمز مختلف أيضًا ، مثل "foo_bar" بدلاً من "foo.bar". ومع ذلك ، هذا هو رائد مقدار العمل الذي يتطلب المعرفة PropertyDescriptor
, ICustomTypeDescriptor
وربما TypeDescriptionProvider
, ، وبالتأكيد لا يستحق كل هذا العناء ،
أبسط حل هو كشف العقار باعتباره shim / pass-thru:
public string Value2Description {
get {return Value2.Description;} // maybe a null check too
}
ثم ارتباط بـ "Value2Description" إلخ.
لست متأكدًا مما إذا كنت تستخدم ASP.NET ، ولكن إذا كانت الإجابة بنعم ، فيمكنك استخدام عمود قالب وطريقة eval () لعرض قيم الكائنات المتداخلة. على سبيل المثال لعرض خاصية الوصف للفرع:
<asp:GridView ID="grid" runat="server" AutoGenerateColumns="true">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Literal Text='<%# Eval("Value2.Description") %>' runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
لست متأكدًا مما إذا كان هذا شيئًا كهذا فأنت بعد ...
يمكنك كتابة طريقة مثل:
protected string getSubObject(object o)
{
string result = string.empty;
try
{
result = ((subObject)o).Description;
}
catch
{ /*Do something here to handle/log your exception*/ }
return result;
}
ثم ربط الكائن شيء مثل هذا:
<asp:Literal Text='<%# getSubObject(Eval("Value2")) %>' runat="server" />