webForumDet fria alternativet

Generisk metod för att binda ListItems

.NET

1 svar · 321 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

Hello,
jag stöter rätt ofta på att man vill visa flera kolumner i t.ex. en dropdownlist och då blir man tvungen till att loopa igenom sin samling och adda varje item mot listen istället för att binda den.
Tänkte att jag skulle fixa en generisk hjälpmetod för detta.
Metoden måste då kunna ta emot olika samlingar och visa x-antal kolumner till att börja med. Jag körde dock fast direkt! :(
Jag vet ungefär vad jag vill ha men har inte en susning om vad jag behöver göra! Har denna exempelkod:

BusinessRegisterStatusService statusService = new BusinessRegisterStatusService();
IEnumerable<BusinessRegisterStatus> statuses = statusService.GetStatuses(UserInfo.CurrentSite);
dropDownListStatus.Items.AddRange(GetListItemCollection(typeof(BusinessRegisterStatus), 
     statuses, "{0} - {1}", "Code,Name", "{0}", "ID"));
dropDownListStatus.DataBind();
public ListItem[] GetListItemCollection(Type objectType, object collection, 
     string textFormat, string textColumns, string valueFormat, string valueColumns)
{
      //Response.Write(collection.GetType().ToString());
      //List<typeObject.> items = new List<ListItem>();
            
      return items.ToArray();
}

Resultatet av en listitem ska då bli:

<option value="1234">ABC - Namnet</option> //där 1234 är ID och ABC är Code och Namnet är Name

Är jag helt galet ute? :OO
Om inte, hur loopar jag igenom min samling och plockar ut rätt properties?

Medlem sedan juni 20003 076 inlägg
#2

Inte vet jag hur men jag lyckades på nått sätt få ihop det! :)

BusinessRegisterStatusService statusService = new BusinessRegisterStatusService();
            IEnumerable<BusinessRegisterStatus> statuses = statusService.GetStatuses(UserInfo.CurrentSite);
            dropDownListStatus.Items.AddRange(GetListItemCollection(statuses, "{0} - {1}", "Code,Name", "{0}", "ID"));
            //dropDownListStatus.DataBind();
public ListItem[] GetListItemCollection<T>(IEnumerable<T> collection, 
string textFormat, string textColumn, string valueFormat, string valueColumn)
        {
            PropertyInfo[] pi = typeof(T).GetProperties();
            string[] textColumns = textColumn.Split(',');
            string[] valueColumns = valueColumn.Split(',');
            List<ListItem> listItems = new List<ListItem>();
            ListItem listItem;

            foreach (var item in collection)
            {
                listItem = new ListItem();
                listItem.Text = string.Format(textFormat, GetValueFromProperty(pi, item, textColumns));
                listItem.Value = string.Format(valueFormat, GetValueFromProperty(pi, item, valueColumns));
                listItems.Add(listItem);
            }

            return listItems.ToArray();
        }

        private object[] GetValueFromProperty<T>(PropertyInfo[] pi, T obj, string[] props)
        {
            List<object> items = new List<object>();
            foreach (var p in pi)
            {
                foreach (string s in props)
                {
                    if (p.Name == s)
                        items.Add(p.GetValue(obj, null));
                }
            }

            return items.ToArray();
        }

Det vore dock roligt att få lite kommentarer på koden, om den går att förfina! :)

263 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)