ComboBox занимает 2 столбца, отображая 1-й, используя 2-й с Thread.Task - PullRequest
0 голосов
/ 14 декабря 2011

Я сделал предыдущий пост, в котором пытался использовать текстовое поле. Из этого я узнал, что вы можете просто добавить результаты SQL-запроса (точный читатель) в ComboBox, а затем отобразить и использовать другое значение столбца.

Проблема, с которой я столкнулся, заключается в том, что я использую для своей формы задачу, которая выполняет другой ОГРОМНЫЙ SQL-запрос, поэтому он не блокирует мои элементы управления в моей форме. Проблема в том, что я использую метод invoke, обернутый вокруг того элемента управления, который получает только 1-й столбец.

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);
        }
}

То, что я хочу сделать, это добавить еще одно поле в мой запрос под названием «код ключа», сохранить его во втором столбце в моем ComboBox, а затем отобразить поле имени для пользователя, но использовать поле кода ключа в качестве значения для использовать в моем гигантском запросе задачи.

Мне трудно понять, как мне это сделать.

1 Ответ

0 голосов
/ 14 декабря 2011

В прошлом я использовал объект, который содержит переопределение 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();
...