2011-01-25 11 views
9

Moje procedura przechowywana jest jak tenFormat DropDownList.TextValue

SELECT Id, StudentName 
FROM xyz 

Mam rozwijanej listy w ASP.NET, które wczytuję jak:

ddlA.DataSource = // Some source 
ddlA.DataTextField = "Id" + " -" + "StudentName"; 
ddlA.DataValueField = "Id"; 
ddlA.DataBind(); 
ddlA.Items.Insert(0, new ListItem(" Select one", "0")); 

Ale w rachunku Databind(), Otrzymuję ten błąd:

System.Web.HttpException: DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'Id-StudentName'.

W części tekstowej listy rozwijanej chcę wyświetlić połączoną wartość e of Id - StudentName.

Jak mogę to zrobić?

Odpowiedz

14
DropDownList1.DataTextFormatString = "{0} - {1}"; 
DropDownList1.DataTextField = "Id,StudentName"; 

Wydaje się, że to nie jest osiągalnym automatycznie, na przykład patrz this MS Connect ticket.


zatem zrobić programowo:

foreach (var row in table.Rows) 
{ 
    row.Field<string>("text") = String.Format(..); 
} 

lub

foreach (var item in data) 
{ 
    new ListItem { Text = String.Format(..); }; 
} 
+4

Otrzymuję ten błąd podczas tworzenia kopii danych "DataBinding:" System.Data.DataRowView "nie zawiera właściwości o nazwie" Id, StudentName ". – Zerotoinfinity

+0

Ale nadal nie działa, ciąg formatu traktuje "," jako tysiąc seperatora zamiast seperatora nazwy właściwości. – MrFox

+0

Łącze nie działa, rozwiązałem je teraz, wybierając nowy annonymous obiekt, który ma właściwość Name wyświetlającą połączony tekst. – MrFox

1

można zmienić procedurę przechowywaną do:

SELECT Id, Id + " - " StudentName as Text FROM xyz 

i zmienić wiązanie się:

ddlA.DataSource = // Some source 
ddlA.DataTextField = "Text" 
ddlA.DataValueField = "Id";  
ddlA.DataBind();  
ddlA.Items.Insert(0, new ListItem(" Select one", "0")); 
+0

Dzięki, ale nie mogę zmienić procedury przechowywanej. Jest już w użytkownikach w kilku miejscach. – Zerotoinfinity

+0

W takim przypadku należy wykonać pętlę przez zestaw danych, utworzyć nowy zestaw danych i utworzyć nową kolumnę o nazwie tekst i przypisać identyfikator + "-" + tekst jako wartość i powiązać nowy zestaw danych z combobox. – Pabuc

+0

Nie transformuj na warstwie danych, zrób to na poziomie prezentacji – abatishchev

2

Jeśli DataSource jest DataTable, można dodać "ekspresja" (kolumna obliczeniowa) do tabeli. Wyrażenie dla nowej kolumny będzie wyglądać następująco:

newcolumn.Expression = "Id + ' - ' + StudentName"; 
6

Można to osiągnąć stosując kod

dsStudent.Tables[0].Columns.Add("IdWithStudenName",typeof(string),"Id + ' - ' + StudenName"); 
DropDownList1.DataSource = dsStudent; 
DropDownList1.DataTextField = "IdWithStudenName"; 
DropDownList1.DataBind(); 
DropDownList1.Items.Insert(0, new ListItem("Please select")); 

Więcej zrozumieniem odnoszą here.

13

Można użyć LINQ do nowego źródła danych zawierającą displayfield który jest sformatowany, jak chcesz go mieć, jak:

var datasource = from x in products 
       select new { 
        x.Id, 
        x.Code, 
        x.Description, 
        DisplayField = String.Format("{0} ({1})", x.Code, x.Description) 
       }; 

comboBox.DataSource = datasource; 
comboBox.DataValueField = "Id"; 
comboBox.DataTextField = "DisplayField"; 
comboBox.DataBind(); 
-1

to bardzo proste, tylko masz Concat pola w zapytaniu

SELECT Id ,Id || ' ' || StudentName ""TEXT"", 
FROM xyz 

następnie zbudować listę rozwijaną

ddlA.DataSource = // Some source 
ddlA.DataTextField = "TEXT"; 
ddlA.DataValueField = "Id"; 
ddlA.DataBind(); 
ddlA.Items.Insert(0, new ListItem(" Select one", "0")); 
+0

Podoba mi się to najlepiej –

1

dół Jeśli masz listę klasy, aby wypełnić d zejście na dół, to chyba najlepiej zrobić;

List<FOO> foo = new List<FOO>(); 

ddlFoo.DataSource = foo.Select(x => 
    new ListItem { Text = x.Text1 + " - " + x.Text2, Value = x.Id.ToString() }); 
ddlFoo.DataBind(); 
+0

To naprawdę fajna sztuczka. –