سؤال

هل هناك طريقة لجعل خاصية datatextfield لقائمة منسدلة في asp.net عبر c# مكونة من أكثر من خاصية لكائن واحد؟

public class MyObject
{
  public int Id { get; set; }
  public string Name { get; set; }
  public string FunkyValue { get; set; }
  public int Zip { get; set; }
}

protected void Page_Load(object sender, EventArgs e)
{
  List<MyObject> myList = getObjects();
  ddList.DataSource = myList;
  ddList.DataValueField = "Id";
  ddList.DataTextField = "Name";
  ddList.DataBind();
}

أريد على سبيل المثال.لا تستخدم "الاسم"، ولكن "الاسم (الرمز البريدي)" على سبيل المثال.

بالتأكيد، يمكنني تغيير فئة MyObject، لكنني لا أريد القيام بذلك (لأن فئة MyObject موجودة في فئة نموذجية ولا ينبغي أن أفعل شيئًا أحتاجه في واجهة المستخدم).

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

المحلول

إضافة عقار آخر إلى فئة MyObject وربط تلك الخاصية:

public string DisplayValue
{
 get { return string.Format("{0} ({1})", Name, Zip); }
}

وأو إذا كنت لا يمكن تعديل MyObject، إنشاء كائن المجمع في طبقة العرض (فقط للعرض). ويمكن أيضا أن يتم ذلك باستخدام بعض LINQ:

List<MyObject> myList = getObjects();
ddList.DataSource = (from obj in myList
                    select new
                    {
                      Id = obj.Id,
                      Name = string.Format("{0} ({1})", obj.Name, obj.Zip)
                    }).ToList();
ddList.DataValueField = "Id";
ddList.DataTextField = "Name";
ddList.DataBind();

و(آسف أنا لا لديك Visual Studio المتاحة، لذلك قد يكون هناك أخطاء في الشفرة)

نصائح أخرى

وأوصي بقراءة هذا: http://martinfowler.com/eaaDev/PresentationModel.html

تريد بشكل أساسي إنشاء فئة تمثل الارتباط بواجهة مستخدم معينة.لذلك يمكنك تعيين النموذج الخاص بك (كائني في المثال الخاص بك) إلى كائن ViewModel، ثم ربط القائمة المنسدلة بهذه الطريقة.إنها طريقة رائعة للتفكير في فصل الاهتمامات.

يحرر:إليك سلسلة مدونات أخرى على ViewModel: http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx

وراجع للشغل، محاولة تعيين "DataTextField" و "DataValueField" قبل تعيين مصدر البيانات. وبذلك منع اطلاق النار من "SelectedIndexChanged" حدث حين ربط البيانات ...

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