我想使用c#使用comboboxcolumns创建datagridview。
问题在于我不知道如何为每行中的组合框提供不同的值。
DataTable dt = new DataTable();
dt.Columns.Add("state");
dt.Columns.Add("city");
dt.Rows.Add("a1", "b1");
dt.Rows.Add("a1", "b2");
dt.Rows.Add("a2", "b3");
dt.Rows.Add("a2", "b4");
dt.Rows.Add("a3", "b5");
DataGridViewComboBoxColumn comboStates = new DataGridViewComboBoxColumn();
comboStates.HeaderText = "HeaderText_1";
this.dataGridView1.Columns.Insert(0, comboStates);
DataGridViewComboBoxColumn comboCities = new DataGridViewComboBoxColumn();
comboCities.HeaderText = "HeaderText_2";
this.dataGridView1.Columns.Insert(1, comboCities);
for (int i = 0; i < dt.Rows.Count; i++)
{
dataGridView1.Rows.Add();
comboStates.Items.Add(dt.Rows[i][0]);
DataGridViewComboBoxCell stateCell = (DataGridViewComboBoxCell) (dataGridView1.Rows[i].Cells[0]);
stateCell.Value = comboStates.Items[i];
comboCities.Items.Add(dt.Rows[i][1]);
DataGridViewComboBoxCell cityCell = (DataGridViewComboBoxCell)(dataGridView1.Rows[i].Cells[1]);
cityCell.Value = comboCities.Items[i];
}
此示例给出以下结果:
每行:
comboboxcolumnstate:
a1
a1
a2
a2
a3
comboboxcolumncity:
b1
b2
b3
b4
b5
我知道这是正常的,因为我正在循环数据表。
那我怎么能得到这个结果:
row1:comboboxcolumnstate comboboxcolumncity
a1 b1 - b2
row2:comboboxcolumnstate comboboxcolumncity
a2 b3 - b4
row2:comboboxcolumnstate comboboxcolumncity
a3 b5
我是C#的新手。我搜索了很多,但我没有找到解决这个问题的解决方案。 谢谢
答案 0 :(得分:7)
这是一个可以帮助您入门的示例代码。
首先,我为每个州创建一个值列表(城市)。为此,Dictionary
集合非常方便:
Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();
for (int i = 0; i < dt.Rows.Count; i++)
{
string state = dt.Rows[i][0].ToString();
string city = dt.Rows[i][1].ToString();
if (! dict.Keys.Contains(state )) dict.Add(state, new List<string>());
dict[state].Add(city);
}
我在你的桌子上循环,每一行都为城市添加一个新条目,如有必要,还为该州添加。
现在,我们修改DGV的设置,以便在每个Lists
的{{1}}中使用Items
。
注意:关键是使用DataGridViewComboBoxCell
,不 DataGridViewComboBoxCells
!
为了便于访问,我再次为州和城市值创建字符串变量..
DataGridViewComboBoxColumns
注意:这会设置DropDowns中的值,但在“状态”列中每次更改后,您需要调整该行中的“城市”列!因此,通过将for (int i = 0; i < dt.Rows.Count; i++)
{
string state = dt.Rows[i][0].ToString();
string city = dt.Rows[i][1].ToString();
dataGridView1.Rows.Add();
DataGridViewComboBoxCell stateCell =
(DataGridViewComboBoxCell)(dataGridView1.Rows[i].Cells[0]);
stateCell.Items.AddRange(dict.Keys.ToArray());
stateCell.Value = state;
DataGridViewComboBoxCell cityCell =
(DataGridViewComboBoxCell)(dataGridView1.Rows[i].Cells[1]);
cityCell.Items.AddRange(dict[state].ToArray());
cityCell.Value = city;
}
持续移动到类级别并创建一个可在此类更改后调用的小函数,这是一个好主意。
以下是此功能的示例:
Dictionary
请注意,新private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0)
setCities(e.RowIndex, dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
}
void setCities(int row, string state)
{
DataGridViewComboBoxCell cityCell =
(DataGridViewComboBoxCell)(dataGridView1.Rows[row].Cells[1]);
cityCell.Items.Clear();
cityCell.Items.AddRange(dict[state].ToArray());
cityCell.Value = cityCell.Items[0];
}
仅在离开已修改的单元格后显示!
最后注意事项:如果您确实希望每个州只显示一行,则需要更改填充cityCell.Value
的循环,使其不要超过您的表而是覆盖DGV
集合:
dict.Keys