【发布时间】:2021-08-09 12:47:59
【问题描述】:
我目前正在使用来自 db 查询的列表填充组合框,如下所示:
private List<ExerciseAndVideo> GetExerciseVideoComboBoxListFromDB()
{
List<ExerciseAndVideo> exerciseList = new List<ExerciseAndVideo>();
con = new SqlConnection("my db path etc");
cmd = new SqlCommand();
con.Open();
cmd.Connection = con;
cmd.CommandText = "SELECT nome, link_video, gruppo_muscolare FROM Esercizi ORDER BY nome ASC";
dr = cmd.ExecuteReader();
while (dr.Read())
{
ExerciseAndVideo item = new ExerciseAndVideo();
item.Esercizio = dr.GetString(0);
item.Video = dr.GetString(1);
item.Gruppo = dr.GetString(2);
exerciseList.Add(item);
}
con.Close();
return exerciseList;
}
public class ExerciseAndVideo
{
public string Esercizio { get; set; }
public string Video { get; set; }
public string Gruppo { get; set; }
}
我现在要做的是在 dgv 中添加另一个组合框,用于过滤锻炼列表的结果。
我添加了这样的组合:
dataGridView1.Columns.Add(GetGroupComboBoxColumn(GrList));
private List<GroupList> GetGroupComboBoxListFromDB()
{
List<GroupList> GrList = new List<GroupList>();
GrList.Add(new GroupList { Gruppo = "quads" });
GrList.Add(new GroupList { Gruppo = "hamstring" });
GrList.Add(new GroupList { Gruppo = "gluteus" });
return GrList;
}
我该怎么做?
我希望当在组合 1 中选择“四边形”时,在组合 2 中我只看到四边形的练习。
编辑
这里有在 dgv 组合上触发的事件:
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex].Name == "Esercizio")
{
curCombo = e.Control as ComboBox;
if (curCombo != null)
{
curCombo.SelectedIndexChanged -= new EventHandler(curCombo_SelectedIndexChanged);
curCombo.SelectedIndexChanged += new EventHandler(curCombo_SelectedIndexChanged);
}
}
}
private void curCombo_SelectedIndexChanged(object sender, EventArgs e)
{
if (curCombo != null && curCombo.SelectedValue != null)
{
ExerciseAndVideo selectedExercise = (ExerciseAndVideo)curCombo.SelectedItem;
dataGridView1.CurrentRow.Cells["Video"].Value = selectedExercise.Video;
dataGridView1.CurrentRow.Cells["Gruppo"].Value = selectedExercise.Gruppo;
}
}
private void dataGridView1_CellLeave(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.Columns[e.ColumnIndex].Name == "Esercizio")
{
if (curCombo != null)
{
curCombo.SelectedIndexChanged -= new EventHandler(curCombo_SelectedIndexChanged);
}
}
}
这里组合如何获取数据源:
private DataGridViewComboBoxColumn GetGroupComboBoxColumn(List<GroupList> GrList)
{
DataGridViewComboBoxColumn cbCol = new DataGridViewComboBoxColumn();
cbCol.HeaderText = "Zona";
cbCol.Name = "Zona";
cbCol.DisplayMember = "Zona";
cbCol.DataSource = GrList;
cbCol.Width = 100;
return cbCol;
}
private DataGridViewComboBoxColumn GetExcerciseComboBoxColumn(List<ExerciseAndVideo> exerciseList)
{
DataGridViewComboBoxColumn cbCol = new DataGridViewComboBoxColumn();
cbCol.HeaderText = "Esercizio";
cbCol.Name = "Esercizio";
cbCol.DisplayMember = "Esercizio";
// if I use this string works fine
string selectedGroup = "quadricipiti";
var filteredList = exerciseList.Where(x => x.Gruppo == selectedGroup).ToList();
cbCol.DataSource = filteredList;
cbCol.Width = 140;
return cbCol;
}
编辑 2
我按照建议编辑了 curCombo_SelectedIndexChanged 事件,但由于在函数中不存在,所以在 exerciseList 上出现错误:
private void curCombo_SelectedIndexChanged(object sender, EventArgs e)
{
if (curCombo != null && curCombo.SelectedValue != null)
{
ExerciseAndVideo selectedExercise = (ExerciseAndVideo)curCombo.SelectedItem;
dataGridView1.CurrentRow.Cells["Video"].Value = selectedExercise.Video;
dataGridView1.CurrentRow.Cells["Gruppo"].Value = selectedExercise.Gruppo;
string selectedGroup = Convert.ToString((GroupList)SelectedCombo.SelectedItem);
DataGridViewComboBoxCell Esercizi = (DataGridViewComboBoxCell)(dataGridView1.CurrentRow.Cells["Esercizi"]);
var filteredList = exerciseList.Where(x => x.Gruppo == selectedGroup).ToList();
Esercizi.DataSource = filteredList;
}
}
编辑 3
更正列表代码以使其作为全局工作后,我没有收到任何错误,但我无法从组合 1 中选择选定的值作为选定组。
如果我使用“quads”之类的字符串或其他一切正常,否则如果我尝试从组合 1 中选择值,我会在组合 2 上得到一个空白列表。
这是我尝试从组合 1 中获取值的一些代码:
string selectedGroup = Convert.ToString(dataGridView1.CurrentRow.Cells["Zona"]);
string selectedGroup = SelectedCombo.SelectedItem.ToString();
string selectedGroup = Convert.ToString((GroupList)SelectedCombo.SelectedItem);
最后编辑
在这里我发现正在努力从组合 1 中获取价值:
string selectedGroup = Convert.ToString(dataGridView1.CurrentRow.Cells[0].FormattedValue.ToString());
现在的问题是,要使过滤器正常工作,我必须选择组合 1 中值的 2 倍。
例如,我在组合 1 中选择“quads”,在组合 2 中得到一个空白列表。我再次选择“quads”,得到过滤后的结果。
我认为问题可能出在事件中,但我没有看到错误:
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex].Name == "Esercizio")
{
curCombo = e.Control as ComboBox;
if (curCombo != null)
{
curCombo.SelectedIndexChanged -= new EventHandler(curCombo_SelectedIndexChanged);
curCombo.SelectedIndexChanged += new EventHandler(curCombo_SelectedIndexChanged);
}
}
if (dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex].Name == "Zona")
{
curCombo = e.Control as ComboBox;
if (curCombo != null)
{
curCombo.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
curCombo.SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged);
}
}
}
private void curCombo_SelectedIndexChanged(object sender, EventArgs e)
{
if (curCombo != null && curCombo.SelectedValue != null)
{
ExerciseAndVideo selectedExercise = (ExerciseAndVideo)curCombo.SelectedItem;
dataGridView1.CurrentRow.Cells["Video"].Value = selectedExercise.Video;
dataGridView1.CurrentRow.Cells["Gruppo"].Value = selectedExercise.Gruppo;
}
}
private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (curCombo.SelectedValue != null)
{
string selectedGroup = Convert.ToString(dataGridView1.CurrentRow.Cells[0].FormattedValue.ToString());
DataGridViewComboBoxCell Esercizi = (DataGridViewComboBoxCell)(dataGridView1.CurrentRow.Cells["Esercizio"]);
// string selectedGroup = "femorali";
var filteredList = exerciseList.Where(x => x.Gruppo == selectedGroup).ToList();
Esercizi.DataSource = filteredList;
}
}
private void dataGridView1_CellLeave(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView1.Columns[e.ColumnIndex].Name == "Esercizio")
{
if (curCombo != null)
{
curCombo.SelectedIndexChanged -= new EventHandler(curCombo_SelectedIndexChanged);
}
}
if (dataGridView1.Columns[e.ColumnIndex].Name == "Zona")
{
if (curCombo != null)
{
curCombo.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
}
}
}
【问题讨论】:
-
我可以推测的是……网格中有两列组合框。在组合框第 1 列中,每个组合框都包含锻炼视频项目?在组合框第 2 列中,每个组合框都包含“四边形”等项......如图所示。您想要的是,当用户从第 2 列的组合框中选择一个值时,该组合框 1 将被过滤为仅包含与“四边形”或用户选择的任何内容相关的视频。这个对吗?如果是这样,下面的链接可能会有所帮助。
-
嗨,JohnG,是的,这就是我想要做的。您的回答非常完整,但让我感到困惑。我将尝试在新的 win 表单上实现它,然后在我的代码中实现它
-
@JohnG 经过几次尝试,我无法让它为我工作。我试图用我的数据更改银行和分行,但由于代码是为另一种逻辑设计的,所以我在某处丢失了
-
我同意银行分行有点不同。我把银行想象成一个“集团”对象,把分行想象成一个
ExcerciseAndVdeo对象。在银行分行示例中,一个区别是银行(集团)保留了有关哪些分行(练习视频)属于该银行(集团)的信息。在您的示例中,它有点相反,因为每个组保留属于该组的所有锻炼视频的列表是没有意义的。视频保留 IT 所属组的列表更有意义。
标签: c# datagridview