如何根据组合框选择过滤datagridview

问题描述 投票:0回答:4

我有一个DatagridView包含学生信息,包括班级,年龄等。现在我想创建一个ComboBox,它具有过滤哪个类的功能(例如,如果我在组合框上选择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
}

这是组合框的代码:

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类的学生,依此类推。并且当我选择datagridview时,组合框显示system.Data.Entity.Error

c# sql-server datagridview filter combobox
4个回答
0
投票

在组合框选择更改事件时,将数据网格视图RowFilter属性设置为选定值:

dv.RowFilter = "YourColumnName = ComboBoxSelectedValue";

使用类似的问题/解决方案更新此问题here


0
投票

在页面加载中替换此Add!PostBack

private void frmdbSiswa_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
 {
    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
    dataGridViewSiswa.DataBind();
    cboKelas.DataSource = db.Kelas.ToList();//combobox
    cboKelas.DataBind();
   }
}

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

}

0
投票

你能这样试试吗?

using System;
using System.Data;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.ColumnCount = 3;
            dataGridView1.Columns[0].Name = "Product ID";
            dataGridView1.Columns[1].Name = "Product Name";
            dataGridView1.Columns[2].Name = "Product Price";

            string[] row = new string[] { "1", "Product 1", "1000" };
            dataGridView1.Rows.Add(row);
            row = new string[] { "2", "Product 2", "2000" };
            dataGridView1.Rows.Add(row);
            row = new string[] { "3", "Product 3", "3000" };
            dataGridView1.Rows.Add(row);
            row = new string[] { "4", "Product 4", "4000" };
            dataGridView1.Rows.Add(row);

            DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
            cmb.HeaderText = "Select Data";
            cmb.Name = "cmb";
            cmb.MaxDropDownItems = 4;
            cmb.Items.Add("True");
            cmb.Items.Add("False");
            dataGridView1.Columns.Add(cmb);

        }
    }
}

如果您还有其他问题,请回复。

http://csharp.net-informations.com/datagridview/csharp-datagridview-combobox.htm


0
投票

除非你绝对必须有一个List<T>作为DataSource到网格,我建议你使用DataTable作为DataSource到网格。它可能会使事情变得更容易,看起来你可能已经有来自DataTabledb.Tabel_Siswa.ToList(),它似乎是从表格中制作一个列表。

话虽如此,下面是使用组合框使用DataTableDataView过滤网格中的数据的示例。这是一个简单的形式,有一个空的DataGridView和一个空的ComboBox。全球DataTable变量gridTable被用作网格的DataSource。全球DataView变量dv用于“过滤/取消过滤”gridTable

在表单加载时,列和一些测试数据被添加到gridTable。然后gridTable被设置为网格的DataSource。最后,ComboBox中填充了“A类,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;
}

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.