gpt4 book ai didi

c# - Datagridview comboboxcolumn每行的不同值

转载 作者:行者123 更新时间:2023-11-30 13:56:32 49 4
gpt4 key购买 nike

我想使用 C# 创建一个带有组合框列的数据 GridView 。

问题是我不知道如何为每一行的组合框赋予不同的值。

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

这个例子给出了以下结果:

对于每一行:

组合框列状态:

a1
a1
a2
a2
a3

组合框列城市:

b1
b2
b3
b4
b5

我知道这是正常的,因为我正在遍历数据表。

那么我怎样才能得到这个结果:

row1: comboboxcolumnstate comboboxcolumncity

             a1               b1 - b2

row2: comboboxcolumnstate comboboxcolumncity

             a2               b3 - b4

row2: comboboxcolumnstate comboboxcolumncity

             a3               b5

我是 C# 新手。我进行了很多搜索,但没有找到解决此问题的解决方案。谢谢

最佳答案

这是一个可以帮助您入门的示例代码。

首先,我为每个州创建了一个值列表(城市)。为此,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 的设置以在每个 DataGridViewComboBoxCellItems 中使用这些 List

注意:这里的关键是使用DataGridViewComboBoxCells不是DataGridViewComboBoxColumns!

为了更容易访问,我再次为州和城市值创建字符串变量..

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 移动到类级别并创建一个您可以在此类更改后调用的小函数来使 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 上循环 收藏:

for (int i = 0; i <  dict.Keys.Count; i++)
{
string state = dict.Keys.ElementAt(i);
string city1 = dict[state][0].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 = city1;
}

关于c# - Datagridview comboboxcolumn每行的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27201551/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com