سؤال

أنا أعمل مع كائن يحتوي على كائنات فرعية داخل (انظر المثال أدناه). أنا أحاول ربط أ 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" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top