2015-03-17 1 views
0

Я новичок в C# и .NETКак отобразить свойство вместо значения в базе данных DataGridViewComboBox?

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

У меня есть следующий код:

bs = new BindingSource(); 
bs.DataSource = typeof(CR); 

dataGridView1.AutoGenerateColumns = false; 
Column1.Width = 400; 
Column1.DataPropertyName = "CR_NAME"; 
Column2.DataPropertyName = "CR_STATE_S"; 
Column2.ValueMember = "CR_STATE_S"; 
Column2.DisplayMember = "GetStateName"; 

Column2.Items.Add("0"); // how to set the matching value here? 
Column2.Items.Add("1"); 
Column2.Items.Add("2"); 

dataGridView1.DataSource = bs; 

GetStateName является свойством CR класса, который возвращает имя соответствия состояния CR. Мне нужно отобразить имя состояния в поле со списком. Как это сделать? Благодарю.

+0

Ваш вопрос довольно неполный. Я должен угадать: если значение столбца установлено, то соответствующий элемент из DropDown отображается автоматически. Если это не так, нет совпадения. Действительно ли 0,1,2 действительно ваши значения CR_STATE_S? – TaW

+0

Да, состояние CR может быть 0, 1 или 2, и когда значение столбца установлено, отображается значение соответствия, возвращаемое GetStateName – user315561

+0

OK. Теперь, каков ваш вопрос? Обратите внимание, что поле со списком отображается только тогда, когда оно выпало; когда он закрыт, то, что вы видите, является столбец. (Это отличается от ComboBox, который также всегда имеет видимую часть текста.) – TaW

ответ

1

Если вы хотите отобразить что-то отличное от значений, которые должны содержать ячейки, то вы не можете просто загрузить одну вещь в элементы ComboBoxCells.

Вместо этого вам нужен DataSource, который имеет по крайней мере, различные поля для двух вещей, которые вы хотите использовать:

  • Поле для видимого представления данных, называемых DisplayMember
  • и поле для фактические данные, называемых ValueMember

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

Позволяет создать очень простой класс и есть список этого класса:

class itemClass 
{ 
    public string display { get; set;} 
    public string value { get; set; } 
    public itemClass(string d, string v) 
    { display = d; value = v;} 
} 

List<itemClass> myItems = new List<itemClass>(); 

private void loadButton_Click(object sender, EventArgs e) 
{ 
    // load the list with all values: 
    myItems.Add(new itemClass("zero", "0")); 
    myItems.Add(new itemClass("one", "1")); 
    myItems.Add(new itemClass("two", "2")); 
    myItems.Add(new itemClass("three", "3")); 
    myItems.Add(new itemClass("four", "4")); 
    myItems.Add(new itemClass("five", "5")); 
    myItems.Add(new itemClass("six", "6")); 

    // prepare the DataGridView 'DGV': 
    DGV.Columns.Clear(); 
    DataGridViewComboBoxCell cCell = new DataGridViewComboBoxCell(); 

    DataGridViewComboBoxColumn cCol = new DataGridViewComboBoxColumn(); 
    DGV.Columns.Add(cCol); 
    cCol.DisplayMember = "display"; 
    cCol.ValueMember = "value"; 
    cCol.DataSource = myItems; 
    cCol.ValueType = typeof(string); 

    // add a few rows, for testing: 
    DGV.Rows.Add(7); 
    for (int i = 0; i < DGV.Rows.Count; 
     i++) DGV.Rows[i].Cells[0].Value = i + ""; 
} 

В примере я загружаю Items вручную. Обычно вам нужно вытащить значения из базы данных или другого источника. Вы можете сделать это либо путем загрузки списка источников данных, как указано выше, либо вы можете получить таблицу поиска независимо или в DataSet.

Если все ячейки должны иметь индивидуальные значения поиска, вам необходимо загрузить их отдельно, а не использовать столбец, но каждая из ячеек будет передана в DataGridViewComboBoxCell.

Смежные вопросы