问题描述
我有一个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()
,它似乎正在从表中列出列表。
话虽如此,下面是一个使用组合框来筛选网格中的数据的示例,其中使用了DataTable
和DataView
。它是一个包含空DataGridView
和空ComboBox
的简单表单。全局DataTable
变量gridTable
用作网格的DataSource
。全局DataView
变量dv
用于对gridTable
进行筛选/取消筛选。
gridTable
。则将gridTable
设置为网格的DataSource
。最后,ComboBox
中填满了条目"Class A,Class B"等…组合框中添加了"无筛选器"选项,以允许用户删除应用的筛选器。
当用户更改组合框选择时,将创建一个新的DataView
,并将其RowFilter
设置为组合框中的选定值。最后,将DataView
dv
设置为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;
}
希望这能有所帮助。