القائمة المنسدلة DataTextField تتألف من الخصائص؟
-
03-07-2019 - |
سؤال
هل هناك طريقة لجعل خاصية 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" حدث حين ربط البيانات ...