Получить выбранное значение из comboBox - PullRequest
2 голосов
/ 15 декабря 2011

Я использую C #, winforms.

У меня небольшая проблема. Я отлаживал как можно больше, что наводит меня на мысль, что код, который я использую, вызывает проблему. Итак, у меня есть поле со списком, заполненное данными из запроса.

Есть 2 столбца «имя» и «код ключа». Я отображаю имя только используя:

accCollection.DisplayMember = "name";

Затем я использую следующее, чтобы получить значение кода клавиши, соответствующее имени.

string acct = accCollection.SelectedValue.ToString();

У меня проблема в том, что код клавиши НЕ соответствует названию. Я думал, что это может быть мой запрос, поэтому я просто отобразил результаты запроса в виде таблицы данных, прежде чем заполнить поле со списком. Представление таблицы данных отображает правильные результаты, что наводит меня на мысль, что я использую неправильный код!

Надеюсь, это глупая проблема с одной строкой, если вы, ребята, хотите больше кода, дайте мне знать, и я отредактирую этот пост.

ОБНОВЛЕНИЕ вот код, который я забыл упомянуть, как вы видите, я уже назначил элемент данных

accCollection.DataSource = myTable;
accCollection.DisplayMember = "name";
accCollection.ValueMember = "keycode";

ОБНОВЛЕНИЕ :::: Хорошо, еще немного информации. выбранное значение должно быть 1557, которое является номером счета имен. но я получаю 1855, это другой номер счета. как я и сказал, данные являются правильными .... вот почему я оооочень смущен!

ОБНОВЛЕНИЕ :: вот код, чтобы вы могли видеть, как я обновляю поле со списком с информацией!

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

ОБНОВЛЕНИЕ :: просто чтобы показать данные, которые я получаю! 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"

почему это?

Ответы [ 3 ]

6 голосов
/ 15 декабря 2011

Вы можете использовать свойство 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]);
}
3 голосов
/ 15 декабря 2011

Несколько вещей:

  1. Свойство DisplayMember должно быть именем столбца, который будет отображаться внутри поля со списком.
  2. Свойство ValueMember должно быть именем столбца, которыйэто стоимость предмета.

    accCollection.DisplayMember = "name";
    
    accCollection.ValueMember = "key";
    

    Если вы хотите значение выбранного элемента, вы должны использовать:

    string acct = accCollection.SelectedValue.ToString();
    

    Получить текст отображения:

    string acct = accCollection.SelectedText;
    

Подробнее см. .

0 голосов
/ 01 июня 2016

Я создал DataTable, и я использовал его, чтобы связать dataTable с выпадающим списком, чтобы отобразить типы заголовков, и я хотел получить идентификатор заголовка, который можно найти в переменной.

      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());            
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...