如何基于组合框选择过滤数据网格视图

人气:889 发布:2022-10-16 标签: c# sql-server datagridview combobox filter

问题描述

我有一个DatagridView包含学生信息,包括班级、年龄等。现在我想创建一个组合框,该组合框具有筛选哪个班级的函数(例如,如果我在组合框上选择了班级IIA,datagridview将只显示班级IIA的学生)。

以下是我在表单中从objectbindingsource加载数据的代码:

private void frmdbSiswa_Load(object sender, EventArgs e)
{
    db = new SiswaSMSEntities();
    tabelSiswaBindingSource.DataSource = db.Tabel_Siswa.ToList();
    agamaSiswaBindingSource.DataSource = db.Agama_Siswa.ToList();
    kelasBindingSource.DataSource = db.Kelas.ToList();
    jenisKelaminBindingSource.DataSource = db.Jenis_Kelamin.ToList();

    dataGridViewSiswa.DataSource = db.Tabel_Siswa.ToList();//to show the datagridview
    cboKelas.DataSource = db.Kelas.ToList();//combobox
}

以下是combobox的代码:

private void cboKelas_SelectionChangeCommitted(object sender, EventArgs e)
{
    dataGridViewSiswa.DataSource = db.Tabel_Siswa.Where(x => x.IdKelas == cboKelas.SelectedIndex).ToList();
}

我还将组合框绑定到数据源。 在这件事上花了好几个小时我都很困惑。我是编程新手,如果我问的是一个非常基本的问题,请原谅。

问题是,当我运行代码时,它确实过滤了数据,但当我选择IA类时,datagridview不显示任何内容,而当我选择iB类时,datagridview显示IA类的学生,依此类推。并且当我选择数据网格视图时,显示的组合框system.Data.Entity.Error

推荐答案

除非您绝对必须将List<T>作为DataSource作为网格,否则我建议您将DataTable作为DataSource使用。这可能会使事情变得更容易,而且您可能已经拥有DataTable中的db.Tabel_Siswa.ToList(),它似乎正在从表中列出列表。

话虽如此,下面是一个使用组合框来筛选网格中的数据的示例,其中使用了DataTableDataView。它是一个包含空DataGridView和空ComboBox的简单表单。全局DataTable变量gridTable用作网格的DataSource。全局DataView变量dv用于对gridTable进行筛选/取消筛选。

在表单加载时,将列和一些测试数据添加到gridTable。则将gridTable设置为网格的DataSource。最后,ComboBox中填满了条目"Class A,Class B"等…组合框中添加了"无筛选器"选项,以允许用户删除应用的筛选器。

当用户更改组合框选择时,将创建一个新的DataView,并将其RowFilter设置为组合框中的选定值。最后,将DataViewdv设置为DataSource以显示过滤结果

DataTable gridTable;
DataView dv;

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  gridTable = GetTable();
  FillTable(gridTable);
  dataGridView1.DataSource = gridTable;
  SetComboBox();
}

private void SetComboBox() {
  comboBox1.Items.Add("No Filter");
  comboBox1.Items.Add("Class A");
  comboBox1.Items.Add("Class B");
  comboBox1.Items.Add("Class C");
  comboBox1.SelectedIndex = 0;
}

private DataTable GetTable() {
  DataTable dt = new DataTable();
  dt.Columns.Add("FName", typeof(string));
  dt.Columns.Add("LName", typeof(string));
  dt.Columns.Add("Class", typeof(string));
  return dt;
}

private void FillTable(DataTable dt) {
  for (int i = 1; i < 5; i++) {
    dt.Rows.Add("FName" + i, "LName" + i, "Class A");
    dt.Rows.Add("FName" + i, "LName" + i, "Class B");
    dt.Rows.Add("Class" + i, "Class" + i, "Class C");
  }
}
RowFilter字符串…dv.RowFilter = "Class = '" + comboBox1.Text + "'"表示过滤,以使名为"Class"的列中的单元格与组合框中的文本相等。例如:"Class=Class B"。这意味着DataSource的列名与筛选器字符串中的内容"匹配"。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
  dv = new DataView(gridTable);
  if (comboBox1.Text == "No Filter")
    dv.RowFilter = "";
  else
    dv.RowFilter = "Class = '" + comboBox1.Text + "'";
  dataGridView1.DataSource = dv;
}

希望这能有所帮助。

849