ComboBox占用2列,使用Thread.Task显示第1列

时间:2011-12-14 15:25:57

标签: c# winforms combobox task

我之前发过一篇试图使用文本框的帖子。从中我发现你可以简单地将一个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字段作为在我的巨型任务查询中使用的值。

我无法弄清楚如何做到这一点。

1 个答案:

答案 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();