コンボボックス選択に基づいてデータグリッドビューをフィルタリングする方法

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を選択したときにも、show system.Data.Entity.Error にコンボボックスが表示されます。

0
の意味がよくわからない今、私はDatagridViewに表示されるデータをフィルタする機能を持つComboBoxを作成したいと思います
追加された 著者 Rahul Agarwal,
それで、あなたがこのコードで直面している問題は何ですか?
追加された 著者 Chetan Ranpariya,
@RahulAgarwal質問を編集しました
追加された 著者 user8018470,
ご回答ありがとうございます@ChetanRanpariya私は質問を編集しました
追加された 著者 user8018470,

4 答え

このように試すことができますか?

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
追加された

コンボボックスの選択が変更されたときに、データグリッドビューのRowFilterプロパティをselected値に設定します。

dv.RowFilter = "YourColumnName = ComboBoxSelectedValue";

Updating this with similar problem/solution here

0
追加された
@OktavianusMisro私はあなたの質問を正しく請け負ったことを確認するために、私に一つのことを言う - あなたが探しているものは質問とは異なる-using-combobox ">こちら
追加された 著者 Rahul Agarwal,
コードを追加しましたが、動作しません@RahulAgarwal
追加された 著者 user8018470,
すみません、私はあなたの答えを誤解しました、私はこれを試みるつもりです
追加された 著者 user8018470,

Unless you absolutely have to have a List as a DataSource to the grid, I suggest you use a DataTable as a DataSource to the grid. It may make things easier and it appears you may already have the DataTable from db.Tabel_Siswa.ToList() which appears to be making a list FROM a table.

そうは言っても、以下は DataTable DataView を使ってグリッド内のデータをフィルターするためにコンボボックスを使う例です。空の 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;
}

お役に立てれば。

0
追加された
私は削除するのが最善の考えではないかもしれないと思います。 SiswaSMSEntities(); が何を返すかを知らなくても、 .ToList()を削除してもうまくいきます。 db.Tabel_Siswa という名前から推測しています…これは DataTable です。また、私のコードでは DataTable を使用していますが、 BindingSource を使用している可能性があります。このデータテーブルは BindingSource でも機能する可能性がありますが、おそらく BindingSource の「filter」プロパティを使用する必要があります。最後に、コンボボックスには、 SelectionChangeCommitted イベントの代わりに SelectedIndexChanged イベントを使用します。
追加された 著者 JohnG,
youuuuuuありがとう、私はこれを試してみるつもりです@ジョン。これは私を正しい方向へ導いたようです。
追加された 著者 user8018470,
このtabelSiswaBindingSource.DataSource = db.Tabel_Siswa.ToList();を削除する必要がありますか。 agamaSiswaBindingSource.DataSource = db.Agama_Siswa.ToList(); kelasBindingSource.DataSource = db.Kelas.ToList(); jenisKelaminBindingSource.DataSource = db.Jenis_Kelamin.ToList(); @ジョン
追加された 著者 user8018470,
さて、あなたの親切をありがとう、私はこれに取り組んでいます。その仕事ならあなたの答えに投票します。ありがとう@JohnG
追加された 著者 user8018470,

このAdd!IsPostBackをページ読み込みに再割り当て

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
追加された
素早い返信をありがとう、@ NegiRox、しかし、それは動作しません
追加された 著者 user8018470,