2016-05-03 14 views
1

Ich hinzugefügt Mitarbeiter LastName und Vorname zu einer Combobox, die funktioniert, z. Nachname, Vorname .. Der Wert sollte als EmpID so eingestellt wird, dass, wenn ich einen Artikel bin ausgewählt hat, wird EmpID Rückkehr als WertC# ComboBox Selected Wert gibt Null, Item und Value beide aus der Datenbank

conn.Open(); 
using (SqlCommand cmd = new SqlCommand("Select (LastName + ', ' + FirstName) AS Employee,EmpID from Employee ", conn)) 
using (SqlDataReader rdr = cmd.ExecuteReader()) 
{ 
    while (rdr.Read()) 
    { 
     ListItem ComboItem = new ListItem(); 
     ComboItem.Text = rdr["Employee"].ToString(); 
     //ComboItem.Value = rdr["EmpID"].ToString(); 

     ComboItem.Value = rdr["EmpID"].ToString() ; 
     GrpEmpCBox.Items.Add(ComboItem); 
     //GrpEmpCBox.Items.Add(rdr["Employee"].ToString()); 
    } 
} 

Aber wenn ich den Wert bin immer davon null zurück.

private void btnRunReport_Click(object sender, EventArgs e) 
{ 
    EmployeeTimecardReport rptEmpTimecard = new EmployeeTimecardReport(); 
    rptEmpTimecard.Employee = GrpEmpCBox.SelectedValue.ToString(); //<--- this returns null 
} 

ist das möglich? Ich versuche nicht, Datenbindung zu verwenden

meine Combobox Eigenschaften:

Datasource: keine

Display: keine

Wert Mitglied: keine

Dropdownstyle: Dropdownlist

Antwort

3

Verwenden die DisplayMember und ValueMember Eigenschaften stattdessen.

Es gibt viele Möglichkeiten, wie Sie dies umsetzen könnte ... hier ist eine:

comboBox1.ValueMember = "Item1";  // the value of the selected item 
comboBox1.DisplayMember = "Item2"; // the field to display to the user 

var emps = new List<Tuple<int, string>>(); 

while (rdr.Read()) 
    emps.Add(Tuple.Create(Convert.ToInt32(rdr["EmpID"]), rdr["Employee"].ToString())); 

comboBox1.DataSource = emps; 

dann den Wert des ausgewählten Elements anzuzeigen:

var selectedValue = comboBox1.SelectedValue.ToString(); 

Ich werde ein hinzufügen zweites Beispiel, um zu zeigen, was diese Eigenschaften tun.

Angenommen, Sie haben eine Mitarbeiterklasse, die Sie erstellt haben.

public class Employee 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public DateTime HireDate { get; set; } 
} 

Und dann ziehen Sie eine Reihe von Daten aus der Employee-Tabelle zurück in der Datenbank ...

var emps = new List<Employee>(); 

while (rdr.Read()) 
    emps.Add(new Employee(ID = Convert.ToInt32(rdr["EmpID"]), 
          Name = rdr["Employee"].ToString(), 
          Age = Convert.ToInt32(rdr["Age"]), 
          HireDate = Convert.ToDateTime(rdr["Hired"]))); 

comboBox1.DataSource = emps; 

Sie können zwei Objekte Ihrer Klasse (1) Anzeige für den Benutzer wählen (DisplayMember) und (2) fungieren als zugrunde liegender Wert (ValueMember).

comboBox1.ValueMember = "ID"; 
comboBox1.DisplayMember = "Name"; 

Jetzt können Sie diese Werte mit comboBox1.SelectedValue und comboBox1.Text bzw. erhalten. Oder Sie können nur den gesamten Employee Datensatz, der in comboBox1.SelectedItem gespeichert ist.

+0

es funktioniert .. kann ich den Zweck von ValueMember und DisplayMember wissen? – FatalError

+1

Gut zu hören. Ich füge ein zweites Beispiel hinzu und sehe, ob das hilft, es aufzulösen. –

+0

vielen Dank – FatalError

Verwandte Themen