我之前发过一篇试图使用文本框的帖子。从中我发现你可以简单地将一个sql查询结果(excute reader)添加到ComboBox
,然后显示并使用其他列值。
我遇到的问题是我正在为我的表单使用一个运行不同的巨大sql查询的任务,因此它不会锁定我的表单中的控件。问题是,我正在使用一个包含该控件的invoke方法,该方法仅获取第一列。
public void fillmycombo()
{
SqlConnection conn1 = new SqlConnection(myConn1);
conn1.Open();
if (string.Compare(_userName, admin) == 0)
{
SqlCommand accountFill = new SqlCommand("SELECT name, FROM dbo.Customer", conn1);
SqlDataReader readacc = accountFill.ExecuteReader();
while (readacc.Read())
{
AddItem(readacc.GetString(0).ToString());
//accCollection.DataSource = readacc;
//accCollection.DisplayMember = "name";
//accCollection.ValueMember = "keycode";
}
conn1.Close();
}
}
您可以看到此方法获取名称。
private void AddItem(string value)
{
if (accCollection.InvokeRequired)
{
accCollection.Invoke(new Action<string>(AddItem), new Object[] { value });
}
else
{
accCollection.Items.Add(value);
}
}
你可以看到我使用invoke方法来包装控件,以便在我的任务上的方法中使用。
private void button1_Click_1(object sender, EventArgs e)
{
checkBox1.Checked = true;
string acct = accCollection.Text;
Task t = new Task(() => GetsalesFigures(acct));
t.Start();
}
这会运行调用我的巨型查询方法的任务。
private void getsalesfigures(string acct)
{
string acct;// test using 1560
SqlConnection conn = new SqlConnection(myConn);
SqlCommand Pareto = new SqlCommand();
BindingSource bindme = new BindingSource();
SqlDataAdapter adapt1 = new SqlDataAdapter(Pareto);
DataSet dataSet1 = new DataSet();
DataTable table1 = new DataTable();
acct = Acct;
string fromDate = this.dateTimePicker1.Value.ToString("MM/dd/yyyy");
string tooDate = this.dateTimePicker2.Value.ToString("MM/dd/yyyy");
Pareto.Connection = conn;
Pareto.CommandType = CommandType.StoredProcedure;
Pareto.CommandText = "dbo.GetSalesParetotemp";
Pareto.CommandTimeout = 120;
Pareto.Parameters.AddWithValue("@acct", acct);
Pareto.Parameters.AddWithValue("@from", fromDate);
Pareto.Parameters.AddWithValue("@too", tooDate);
SetCheckBoxValue(true);
SetPictureBoxVisibility(true);
adapt1.Fill(dataSet1, "Pareto");
SetCheckBoxValue(false);
SetPictureBoxVisibility(false);
SetDataGrid(true, dataSet1, "Pareto", DataGridViewAutoSizeColumnsMode.AllCells);
dataGridView1.AutoResizeColumns(
DataGridViewAutoSizeColumnsMode.AllCells);
}
catch (Exception execc)
{
MessageBox.Show("Whoops! Seems we couldnt connect to the server!"
+ " information:\n\n" + execc.Message + execc.StackTrace,
"Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
}
我想要做的是在我的查询中添加另一个名为“keycode”的字段,将其存储在我的ComboBox
的第二列中,然后显示用户的名称字段,但使用keycode字段作为在我的巨型任务查询中使用的值。
我无法弄清楚如何做到这一点。
答案 0 :(得分:0)
过去,我使用了一个包含ToString()重写的对象,而不是将纯字符串添加到我的组合框(或其他列表)中,我添加了这些对象。然后,当您需要获取所选项的值时,可以将其强制转换并执行GetValue()。这是一个样本。
class LookupTableItem {
private string Text;
private object Value;
public LookupTableItem(string Text, object Value) {
this.Text = Text;
this.Value = Value;
}
public override string ToString() {
return Text;
}
public object GetValue() {
return Value;
}
}
然后,更改AddItem以这种方式添加项目:
accCollection.Items.Add(new LookupTableItem(text, value));
并检索值:
((LookupTableItem)accCollection.Items[0]).GetValue();