2011-12-15 100 views
1

我正在使用C#,winforms。從組合框中獲取選定的值

有一個小問題。我儘可能地進行了調試,導致我相信我使用的代碼導致了問題。 好吧,我有一個組合框,充滿了來自查詢的數據。

有2列「名稱」和「鍵碼」。我只顯示名稱使用:

accCollection.DisplayMember = "name"; 

然後,我使用以下獲取與該名稱對應的鍵代碼值。

string acct = accCollection.SelectedValue.ToString(); 

我遇到的問題是鍵碼與名稱不符。我雖然這可能是我的查詢,所以我做的是在我填充組合框之前在數據網格視圖中顯示查詢結果。數據網格視圖顯示正確的結果,這導致我相信我使用了錯誤的代碼!

希望這是一個愚蠢的單線問題,如果你們想要更多的代碼讓我知道,我會編輯這篇文章。

UPDATE繼承人的代碼,我忘了提,你可以看到我已經分配的數據成員

accCollection.DataSource = myTable; 
accCollection.DisplayMember = "name"; 
accCollection.ValueMember = "keycode"; 

UPDATE ::::好了一些更多的信息。選定的值應該是1557,即姓名帳號。但我得到1855,這是一個不同的帳號。就像我說的數據表是正確的....這就是爲什麼我sooooooo困惑!

更新::繼承人一些代碼,所以你可以看到我如何更新信息的組合框!

SqlCommand accountFill = new SqlCommand("SELECT name, keycode FROM dbo.Customer", conn1); 
SqlDataAdapter readacc = new SqlDataAdapter(accountFill); 
DataTable dt = new DataTable(); 


readacc.Fill(dt); 
dataGridView3.DataSource = dt; 
conn1.Close(); 
accCollection.DataSource = dt; 
accCollection.DisplayMember = "name"; 
accCollection.ValueMember = "keycode"; 

然後我將以下內容傳遞給我的任務,調用我的其他查詢。

private void button1_Click_1(object sender, EventArgs e) 
{ 
    checkBox1.Checked = true; 
    string acct = accCollection.SelectedValue.ToString(); 

    Task t = new Task(() => GetsalesFigures(acct)); 
    t.Start(); 
} 

UPDATE ::只是爲了顯示我得到的數據! enter image description here

好的,所以在調試的一些幫助後,我使用了下面的代碼來獲得這些結果。

var result = accCollection.SelectedValue; 
if (result != null) 
{ 
    MessageBox.Show(result.ToString()); 
} 

此= 1885年這是不對的

但是,當我做到這一點。

DataRowView row = (DataRowView)accCollection.SelectedItem; 
if (row != null) 
{ 
    MessageBox.Show(row[0] + " " + row[1]); 
} 

其顯示正確的數據, 「梅爾克舍姆」, 「1557」

這是爲什麼?

+1

那麼`accCollection.SelectedValue.ToString()`的結果是什麼?你得到的鍵碼是什麼? – Otiel 2011-12-15 10:42:37

+0

已經賦值成員 – lemunk 2011-12-15 10:51:14

回答

3

您可能會使用SelectedValueSelectedItem屬性,但您也必須檢查返回的值是否爲空。

如果綁定DataTable,那麼SelectedItem屬性將返回DataRowView。

DataRowView row = (DataRowView)accCollection.SelectedItem; 
if(row!=null) 
{ 
    MessageBox.Show(row[0] + " " + row[1]); 
} 

在的SelectedValue的情況下,

var result = accCollection.SelectedValue; 
if (result != null) 
{ 
    MessageBox.Show(result.ToString()); 
}   

編輯:

代碼在Form_Load事件:

private void Form1_Load(object sender, EventArgs e) 
{ 
    DataTable dt = new DataTable(); 
    dt.Columns.Add("A1", typeof(int)); 
    dt.Columns.Add("A2"); 
    dt.Rows.Add(1, "A"); 
    dt.Rows.Add(2, "B"); 

    comboBox1.DataSource = dt; 
    comboBox1.DisplayMember = "A2"; 
    comboBox1.ValueMember = "A1"; 
} 

守則按一下按鈕處理程序:

var result = comboBox1.SelectedValue; 
if (result != null) 
{ 
    MessageBox.Show(result.ToString()); 
} 


DataRowView row = (DataRowView)comboBox1.SelectedItem; 
if (row != null) 
{ 
    MessageBox.Show(row[0] + " " + row[1]); 
} 
3

幾件事情:

  1. DisplayMember屬性應該是列名的組合框內顯示。
  2. ValueMember屬性應該是該項目的值的列的名稱。

    accCollection.DisplayMember = "name"; 
    
    accCollection.ValueMember = "key"; 
    

    如果你想選擇的項目的價值,你應該使用:

    string acct = accCollection.SelectedValue.ToString(); 
    

    獲取顯示文本:

    string acct = accCollection.SelectedText; 
    

詳見this

+0

並獲得所選項目的顯示文本:`string accText = accCollection.SelectedText;` – Otiel 2011-12-15 10:48:20

0

我已經創建了一個DataTable &我用來綁定dataTable到組合框來顯示標題類型,並且我希望獲取數據表中的標題id給一個變量。

 cmbTitle.DataSource=dataTable; 
     cmbTitle.DisplayMember="title_type"; 
     cmbTitle.ValueMember="id"; 

然後cmbtitle的選擇更改事件,我選擇的價值得到了成員爲一個字符串並解析在成整數保存回數據庫,因爲它是一個外鍵。

private void cmb_title_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     string userTitle = cmb_title.SelectedValue.ToString();    
     int.TryParse(userTitle, out this.userTitle); 
     MessageBox.Show(this.userTitle.ToString());    
    }