2011-12-15 101 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());    
    }