2009-01-31 3 views
7

Ich habe eine Reihe von Tabellen in meiner DB, die Verweise auf ein Schlüsselwertpaar halten:gridview binden Dropdownlist zur Liste <KeyValuePair <int, string>>

Typen von Telefonnummern:

  • 1 - Startseite
  • 2 - Arbeiten
  • 3 - Mobil
  • 4 - Fax

usw.

Also habe ich eine Tabelle für die Typen und wenn sie in anderen Tabellen verwendet werden, verweisen sie den int-Wert als Fremdschlüssel. Wenn ich sie herausgezogen habe, habe ich sie als keyvaluepair<int, string> Artikel in der Klasse gespeichert, die sie verwendet.

Wenn ich eine Liste von ihnen bekommen wollte, dachte ich, ich würde nur eine Liste <> von ihnen erstellen, anstatt zwei verschiedene Arten von Datentypen zu verwenden, um die gleichen Daten zu erhalten.

Mein Problem ist angekommen, wenn ich eine Dropdown-Liste innerhalb einer Gridview ausfüllen muss, wenn ich das EditTemplate-Bit verwende. Wenn ich eine Datenquelle verwende, um dies herauszuziehen, schreibt sie [1 Home] in den Text, anstatt den int als Wert und Home als den anzuzeigenden Text zu setzen.

Ich denke, ich habe wirklich eine Multiple-Frage.

One:

Bin ich dumm? Ist das ein wirklich schlechter Weg, um die Daten herauszuholen und zu speichern (der Keyvaluepair-Teil)? Soll ich das alles nur in einer Datentabelle speichern? Ich habe es nicht gern in Datatable geschrieben. Ich habe meine DAL zu meinem BLL genommen und habe versucht, alles als Objekte oder Objekte von List<> einzukapseln, anstatt Tabellen von allem. Meistens hat das gut funktioniert.

Zwei:

Wenn ich einen Gegenstand wurde mit eher als eine Datentabelle in meine Object für die Dropdownlist zu binden, wie kann ich den aktuell ausgewählten Wert gesetzt wird, anstatt es das erste Element nur in der Liste hat ausgewählt?

EDIT

Wie wurde darauf hingewiesen, unter ich ein Idiot war und mehr nur die Datavaluefield und DataKeyField einstellen benötigt.

die Dropdownlist Um musste ich einfach tun zu binden:

SelectedValue='<%# DataBinder.Eval(Container, "DataItem.PhoneType.Key") %>' 

Der Grund, warum ich nicht war, dass man sofort gesehen habe, weil es nicht in meiner Intellisense zeigt wurde, aber wenn ich es manuell eingegeben in, es hat funktioniert.

Antwort

29

Verwenden Sie ein Wörterbuch < int, string > und stellen Sie Ihre DropDown Datavaluefield zu Key und Datatextfield zu Wert.

// A sample dictionary: 
    var dictionary = new Dictionary<int, string>(); 
    dictionary.Add(1, "Home"); 
    dictionary.Add(2, "Work"); 
    dictionary.Add(3, "Mobile"); 
    dictionary.Add(4, "Fax"); 

    // Binding the dictionary to the DropDownList: 
    dropDown.DataTextField = "Value"; 
    dropDown.DataValueField = "Key"; 
    dropDown.DataSource = dictionary; //Dictionary<int, string> 
    dropDown.DataBind(); 
+0

Dayam - ich dachte, ich hätte ein * leicht * 30 Punkte oder so, aber du hast mich zu ihm. Gute Arbeit und gute Antwort! –

+1

Danke ... das hat es hervorragend gemacht .. es hat auch mit einer Liste von ihnen funktioniert. Aber ich denke in mancher Hinsicht, was ein Wörterbuch überhaupt ist ... – Jon

+0

Ich habe vergessen, DataValueField und DataTextField zu setzen. Die Ursache meines Wertes und der Anzeige ist der Text der Dropdown-Liste. VIELEN DANK! –

0

und seine meine benutzerdefinierte Methode

// Define enum 
public enum ServiceType : int 
{ 
    MinimumService = 1, 
    NormalService = 2, 
    VipService = 99 
} 

// custom method to get my custom text name for each enum type 
public string GetServiceTypeName(ServiceType serviceType) 
{ 
    string retValue = ""; 
    switch (serviceType) 
    { 
     case ServiceType.Print: 
      retValue = "We have some services for you"; 
      break; 
     case ServiceType.BookBinding: 
      retValue = "We ar glad to meet you"; 
      break; 
     default: 
      retValue = "We alywas are ready to make you happy"; 
      break; 
    } 
    return retValue; 
} 

// making dictionary (key and value) for dropdown datasource 
public static Dictionary<string, int> GetAllServiceTypeName() 
{ 
    Dictionary<string, int> dataSource = new Dictionary<string, int>(); 

    foreach (int item in Enum.GetValues(typeof(ServiceType))) 
     dataSource.Add(GetServiceTypeName((ServiceType)item), item); 

    return dataSource; 
} 


    // bind the dropdown to dictionary 
    ddlServiceType.DataSource = GetAllServiceTypeName(); 
    ddlServiceType.DataBind(); 

    // aspx markup code sample 
    <asp:DropDownList ID="ddlServiceType" runat="server" 
     DataTextField="Key" DataValueField="Value"> 
    </asp:DropDownList>