我正在使用C#,winforms。
遇到一个小问题。我尽可能地调试,这让我相信我正在使用的代码导致问题。 好的,所以我有一个填充了查询数据的组合框。
有2列“name”和“keycode”。我只使用以下方式显示名称:
accCollection.DisplayMember = "name";
然后我使用以下内容获取与名称对应的keycode值。
string acct = accCollection.SelectedValue.ToString();
我遇到的问题是键码与名称不匹配。我虽然这可能是我的查询,所以我做的是在填充comboBox之前在数据网格视图中显示查询结果。数据网格视图显示正确的结果,这使我相信我使用了错误的代码!
希望这是一个愚蠢的一线问题,如果你们想要更多代码让我知道,我会编辑这篇文章。
UPDATE继承了我忘记提及的代码,因为你可以看到我已经分配了数据成员
accCollection.DataSource = myTable;
accCollection.DisplayMember = "name";
accCollection.ValueMember = "keycode";
更新::::还有更多信息。所选值应为1557,即名称帐号。但我得到1855,这是一个不同的帐号。就像我说数据表是正确的....这就是为什么我很混淆!
UPDATE ::继承了一些代码,这样你就可以看到我如何用信息更新组合框了!
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 ::只是为了显示我得到的数据!
好的,所以在调试一些帮助之后,我已经使用了以下代码来获得这些结果。
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]);
}
它显示正确的数据,“melksham”“1557”
为什么会这样?
答案 0 :(得分:6)
您可以使用SelectedValue
或SelectedItem
属性,但您还必须检查返回的值是否为空。
如果绑定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";
}
按钮的Click处理程序中的代码:
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]);
}
答案 1 :(得分:3)
几件事:
ValueMember属性应该是列的名称,即列的值。
accCollection.DisplayMember = "name";
accCollection.ValueMember = "key";
如果您想要所选项目的值,您应该使用:
string acct = accCollection.SelectedValue.ToString();
将显示文字设为:
string acct = accCollection.SelectedText;
有关详细信息,请参阅this。
答案 2 :(得分: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());
}