2010-12-20 25 views
2

In einem Versuch, eine 3-Tier-Architektur C# asp.net-Anwendung zu erstellen, habe ich begonnen, eine Klasse zu erstellen, die Datenbank für die Verbindung mit der Datenbank verwendet wird, eine andere Klasse, die ist Stadt mit einer Methode für jede Spalte in den Tabellenstädten und eine Cities-Klasse, in der ich die GetCities-Methode habe, die eine Liste von City-Objekten erstellt und dann mithilfe des DataSource-Assistenten das Steuerelement für die Verwendung der Daten von GetCities() verwendet . Ich bekomme nur Leerzeichen in der Dropdown-Liste. Irgendeine Idee warum?Auffüllen Dropdown-Liste aus einer Liste von Objekten

 public List<City> GetCities() 
    { 
     List<City> cities = new List<City>(); 
     Database db = new Database(); 
     SqlConnection conn = db.GetConnection(); 
     String sql = "SELECT * FROM CITIES"; 
     SqlCommand cmd = new SqlCommand(sql, conn); 
     SqlDataReader reader = cmd.ExecuteReader(); 

     while (reader.Read()) 
     { 
      City c = new City(reader.GetInt32(0), reader.GetString(1).ToString()); 
      cities.Add(c); 
     } 

     db.CloseConnection(); 
     return cities; 
    } 

dank

+0

Das Problem ist in dem Code, den Sie nicht geteilt haben! Wie bevölkern Sie die Liste? ** Was ist der Code, den WIZARD generiert? ** – Aliostad

+0

Ihr Code zum Ausfüllen der Liste sieht gut aus. Das Problem muss sein, wie Sie die Drop-Down-Liste binden (vielleicht können Sie das posten)? Ich weiß, dass du gesagt hast, dass du einen Zauberer benutzt hast, der der erste Ort wäre, an dem ich nachsehen würde, was er tut. Außerdem schließen Sie Ihre Datenbankverbindung, aber wenn eine Ausnahme vorliegt, wird sie nicht geschlossen. Verwenden Sie entweder try/finally oder geben Sie in Ihrem Aufruf von ExecuteReader an, dass die Verbindung geschlossen wird, wenn der Reader geschlossen wird, und verwenden Sie eine using() -Anweisung für Ihren Reader. –

+0

Der Wizard, über den ich spreche, wird durch Klicken auf "Datenquelle auswählen" in der DropDownList aufgerufen, und es erscheint ein Popup-Fenster, das mich zur Eingabe einer Datenquelle auffordert. Ich wähle eine neue Datenquelle und dann ein weiteres Fenster, aus dem ich Object aus einer Liste auswähle, die "Access db, SQL db, Entity" usw. enthält. Danach öffnet sich ein weiteres Fenster, um das Objekt auszuwählen, in meinem Fall Cities. Weiter> Wählen Sie eine Methode, die in meinem Fall GetCities() ist. – user228137

Antwort

0

Das Problem lag in der City-Klasse, die nach einer genauen Überprüfung festgestellt, dass der Konstruktor den Parameter falsch zugewiesen zugewiesen hat. Es funktioniert jetzt. Vielen Dank!

public class City 
{ 
    int id; 
    string name; 

    public City(int id, string name) 
    { 
     this.id = id; 
     this.name = name; 

    } 

    public int Id 
    { 
     get { return id; } 
     set { id = value; } 
    } 
    public String Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

} 
3

Haben Sie die Datatextfield, Datavaluefield Eigenschaften und DataBind nennen?


An dieser Stelle ich versuchen würde, den Begriff zu bekommen so einfach wie möglich zu arbeiten, und starten Sie dann die Dinge Zugabe zurück, bis Sie das Problem zu lokalisieren. Beginnen Sie mit einem brandneuen Seite, fügen Sie ein Dropdownlist, aber nicht die Datenquelle berühren oder Eigenschaften ändern, gehen direkt in den Code-Behind und fügen Sie diese in Page_Load:

DropDownList1.DataValueField = "ID"; 
DropDownList1.DataTextField = "Name"; 
DropDownList1.DataSource = new[] { 
    new { ID = 1, Name = "Alice" }, 
    new { ID = 2, Name = "Mike" }, 
    new { ID = 3, Name = "John" } 
}; 
DropDownList1.DataBind(); 

Funktioniert es? Es tut für mich. Versuchen Sie dann, DataValueField, DataTextField und DataSource zu ändern, um mit Ihrer Kundenliste zu arbeiten. Ist es jetzt kaputt? Dann wissen Sie, dass das Problem irgendwo in der Kundenliste auftaucht, nicht so, wie Sie die Daten binden.

+0

Ich denke, dass diese durch den Assistenten – user228137

+0

gemacht werden, weiß ich wirklich nicht, weil ich nie den Assistenten verwende, aber hilft es wirklich in diesem Fall oder fügt einfach eine nicht benötigte Schicht hinzu? Ich habe immer nur DataTextField, DataValueField, DataSource = someList und DataBind genannt. –

+0

Guter Punkt J.D., aber sogar das folgende in die page_load das Ergebnis ist das gleiche: protected void Page_Load (Objekt Absender, EventArgs e) { Städte c = new Cities(); ddlistLocation.DataSource = c.GetCities(); ddlistLocation.DataTextField = "Name"; ddlistLocation.DataBind(); } – user228137

2

Haben Sie die DataBind() - Methode für das Objekt aufgerufen, das gefüllt werden soll?

+0

Ich habe die DropDownListCities.DataBind() in Page_Load(), aber nichts aufgerufen. – user228137

+0

Wahrscheinlich rufen Sie die DataBind() vor dem Herausziehen der Daten aus der Datenquelle. Nur um zu überprüfen, ob dies das Problem sein könnte, versuchen Sie, das zu verschieben.DataBind() in den Page_OnPrender-Ereignishandler –

Verwandte Themen