DataGridViewComboBoxColumn Имя/значение как?
-
21-09-2019 - |
Вопрос
Я думал, что это было просто, как в доступе.
Пользователь должен установить значение одного столбца в данных DataTable для 1 или 2.
Я хотел представить Combobox, показывающий «один», «два» и установить 1 или 2 за сцену, как я много раз делал в формах доступа.
С другой стороны, если таблица показана, она не должна показывать 1 или 2, а соответствующую строку в комбинировании.
Как я могу заставить эту простую задачу работать ??
Решение
Я предполагаю, что вы имели в виду DataGridView, который предназначен для форм Windows, в то время как GridView предназначен для ASP.NET, хотя вы отметили свой вопрос как таковой.
Как вы связываете данные с DataGridViewComboboxColumn? Вам нужно будет установить Дисплей и свойства Valuemember на DataGridViewComboboboxColumn при настройке данных. Ссылка MSDN на дисплей показывает пример, но она не совсем показывает, что вы запрашиваете, поскольку она устанавливает оба свойства на одно и то же.
Дисплей был бы текст, который вы хотите, чтобы пользователь увидел, и Valuemember будет скрытым основным значением, связанным с ним.
Ради примера, допустим, у вас есть класс выбора в вашем проекте, который представляет ваш выбор и выглядит так:
public class Choice
{
public string Name { get; private set; }
public int Value { get; private set; }
public Choice(string name, int value)
{
Name = name;
Value = value;
}
private static readonly List<Choice> possibleChoices = new List<Choice>
{
{ new Choice("One", 1) },
{ new Choice("Two", 2) }
};
public static List<Choice> GetChoices()
{
return possibleChoices;
}
}
GetChoices () вернет список, содержащий ваш выбор. В идеале у вас будет такой метод в сервисном уровне, или вы можете построить свой собственный список в другом месте, если хотите (в коде вашей формы). Для простоты я объединил все это вместе в одном классе.
В вашей форме вы привяжетесь к списку с DataGridViewComboboboxColumn следующим образом:
// reference the combobox column
DataGridViewComboBoxColumn cboBoxColumn = (DataGridViewComboBoxColumn)dataGridView1.Columns[0];
cboBoxColumn.DataSource = Choice.GetChoices();
cboBoxColumn.DisplayMember = "Name"; // the Name property in Choice class
cboBoxColumn.ValueMember = "Value"; // ditto for the Value property
Теперь вы должны увидеть «один» и «два» в Combobox. Когда вы получаете от него выбранное значение, это должно быть основное значение 1 или 2.
Это идея, стоящая за использованием Displaymember/Valuemember. Это должно заставить вас продолжить и помочь вам адаптировать данные о данных, который вы использовали.
Другие советы
Вот как вы читаете значение из сетки, когда изменение значения в ComboBox изменяется:
dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing;
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dataGridView1.CurrentCell.ColumnIndex == 0 && e.Control is ComboBox)
{
ComboBox comboBox = e.Control as ComboBox;
comboBox.SelectedIndexChanged += LastColumnComboSelectionChanged;
}
}
private void LastColumnComboSelectionChanged(object sender, EventArgs e)
{
var sendingCB = sender as DataGridViewComboBoxEditingControl;
object value = sendingCB.SelectedValue;
if (value != null)
{
int intValue = (int)sendingCB.SelectedValue;
//do something with value
}
}
Источники: эта почта