【问题标题】:C# Combobox and DataGridViewC# 组合框和 DataGridView
【发布时间】:2017-06-09 09:44:02
【问题描述】:

我有一个组合框,可以从选择中检索数据,还有一个 datagridview 可以从另一个查询中检索数据。我想使用组合框值过滤数据网格视图。我正在尝试一切,但没有任何效果。能否请你帮忙?此外,为什么当我声明 dataview=((DataTable)datagridview.datasource.defaultview (combobox_SelectedIndexChanged 中的第一行)时,我再也看不到组合框中的任何值,而是看到 System Data DataRowView 但第一个问题对我来说更重要

    private void Form5_Load(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection(@"Data Source=xxxxx;Initial Catalog=xxxxx;Integrated Security=True;");
        conn.Open();
        SqlCommand sc = new SqlCommand("  SELECT id, customername+' - '+cast(inserted as varchar(19)) as targ FROM bf where customername>'a' order by customername asc, inserted desc ", conn);
        SqlDataReader reader;

        reader = sc.ExecuteReader();
        DataTable dt = new DataTable();
        dt.Columns.Add("id", typeof(string));
        dt.Columns.Add("targ", typeof(string));
        dt.Load(reader);


        comboBox1.ValueMember = "id";
        comboBox1.DisplayMember = "targ";
        comboBox1.DataSource = dt;
        conn.Close();


        var select = "SELECT [id],[CustomerName[email],[Capital] FROM baf order by id desc";
        var c = new SqlConnection("Data Source=xxxxxx;Initial Catalog=xxxxx;Integrated Security=True;"); // Your Connection String here
        var dataAdapter = new SqlDataAdapter(select, c);

        var commandBuilder = new SqlCommandBuilder(dataAdapter);
        var ds = new DataSet();
        dataAdapter.Fill(ds);
        dataGridView1.ReadOnly = true;
        dataGridView1.DataSource = ds.Tables[0];

    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {

        //var dataView = ((DataTable)dataGridView1.DataSource).DefaultView;

        //    if (comboBox1.Text == "Remove filter")
        //    {
        //        dataView.RowFilter = string.Empty;
        //    }
        //    else
        //    {
        //        //dataView.RowFilter = "id = {comboBox1.Text}";
        //    }

        //}

    }

【问题讨论】:

  • 尝试这种方式: private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { DataView dv = dataGridView1.DataSource as DataView; dv.RowFilter="id=[ComboBox1.Text]";给我错误对象引用未设置为对象的实例。并在组合框中显示系统数据 DataRowView
  • 如果您尝试在 RowFilter 上使用字符串插值,您需要在前面加上一个美元符号:$"id = {comboBox1.Text}" 但是,您可能应该使用SelectedValue,而不是Text
  • private void comboBox1_SelectedIndexChanged var dataView = ((DataTable)dataGridView1.DataSource).DefaultView; if (comboBox1.Text == "删除过滤器") { dataView.RowFilter = string.Empty; } else { dataView.RowFilter = $"id = {comboBox1.SelectedValue}";错误意外字符,加上只有赋值调用,增量,减量和新对象可以用作语句,无效的表达式术语''}
  • 什么版本的 Visual Studio?如果您不进行字符串插值,那么您必须从引号中取出组合框属性访问权限。
  • VS 2010 专业版。将属性访问权限从报价单中删除是什么意思?

标签: c# winforms datagridview combobox


【解决方案1】:

您需要为此目的正确使用 BindingSource。下面是完整的工作示例。要试验它,您需要如下:

  1. 创建一个空白表单 Q1
  2. 在窗体中添加一个 DataGridView 控件和一个 ComboBox 控件
  3. 将下面的代码复制粘贴到 Q1.cs 文件中
  4. 运行和实验

我希望这会让你过得很好。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WinFormQ
{
    public partial class Q1 : Form
    {
        public Q1()
        {
            InitializeComponent();
        }

        BindingSource bs;

        private void Q1_Load(object sender, EventArgs e)
        {
            // SqlConnection conn = new SqlConnection(@"Data Source=xxxxx;Initial Catalog=xxxxx;Integrated Security=True;");
            // conn.Open();
            // SqlCommand sc = new SqlCommand("  SELECT id, customername+' - '+cast(inserted as varchar(19)) as targ FROM bf where customername>'a' order by customername asc, inserted desc ", conn);
            // SqlDataReader reader;
            // 
            // reader = sc.ExecuteReader();

            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("targ", typeof(string));
            // dt.Load(reader);

            dt.Rows.Add("1", "Targ-1");  // example code - remove
            dt.Rows.Add("2", "Targ-2");  // example code - remove
            dt.Rows.Add("3", "Targ-3");  // example code - remove
            dt.Rows.Add("4", "Targ-4");  // example code - remove

            comboBox1.ValueMember = "id";
            comboBox1.DisplayMember = "targ";
            comboBox1.DataSource = dt;

            // var select = "SELECT [id],[CustomerName[email],[Capital] FROM baf order by id desc";
            // var c = new SqlConnection("Data Source=xxxxxx;Initial Catalog=xxxxx;Integrated Security=True;");  Your Connection String here
            // var dataAdapter = new SqlDataAdapter(select, c);

            // var commandBuilder = new SqlCommandBuilder(dataAdapter);

            DataSet ds = new DataSet();
            DataTable bf = new DataTable("BF");
            bf.Columns.Add("id", typeof(string));  // example code - remove
            bf.Columns.Add("CustomerName", typeof(string));  // example code - remove
            bf.Columns.Add("Email", typeof(string));  // example code - remove
            bf.Columns.Add("Capital", typeof(string));  // example code - remove

            ds.Tables.Add(bf);
            bs = new BindingSource(ds, "BF");
            // dataAdapter.Fill(bf);

            bf.Rows.Add("1", "Customer-1", "Email-1", "Capital-1");  // example code - remove
            bf.Rows.Add("1", "Customer-2", "Email-2", "Capital-1");  // example code - remove
            bf.Rows.Add("2", "Customer-3", "Email-3", "Capital-2");  // example code - remove
            bf.Rows.Add("3", "Customer-4", "Email-4", "Capital-3");  // example code - remove
            bf.Rows.Add("3", "Customer-5", "Email-5", "Capital-3");  // example code - remove
            bf.Rows.Add("3", "Customer-6", "Email-6", "Capital-3");  // example code - remove
            bf.Rows.Add("4", "Customer-7", "Email-7", "Capital-4");  // example code - remove
            dataGridView1.ReadOnly = true;
            dataGridView1.DataSource = bs;

            this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
        }

        void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.Text == "Remove filter")
            {
                bs.RemoveFilter();
            }
            else if (comboBox1.SelectedValue == null)
            {
                bs.RemoveFilter();
            }
            else
            {
                bs.Filter = "id = " + comboBox1.SelectedValue;
            }
        }

    }
}

【讨论】:

  • 确实谢谢Rupesh,但我应该把BindingSource bs放在哪里; ?我确实在 Public Partial 类之后放了,但是使用你的代码我检索到 Unable to cast object of type 'System.Windows.Forms.BindingSource' to type 'System.Data.DataTable'。
  • 在 Form5_Loan() 方法之前声明 BindingSource bs;。关于演员表问题,我想知道哪一行代码产生了这个错误?
  • 我确实更改了 BindingSource bs 位置,仍然是我的组合中的 System.Data.Systemdatarows,加上错误无法将“System.Windows.Forms.BindingSource”类型的对象转换为“System.Data”。数据表'。在第 75 行: var dataView = ((DataTable)dataGridView1.DataSource).DefaultView;
  • 我已经修改了我的答案并提出了工作示例,如果这可以帮助您获得优雅的解决方案。
【解决方案2】:

我是这样解决的(也许不是最优雅的,但确实有效):

    private void Form5_Load(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection(@"Data Source=xxxxx;Initial Catalog=xxxxx;Integrated Security=True;");
        conn.Open();
        SqlCommand sc = new SqlCommand("  SELECT id, customername+' - '+cast(inserted as varchar(19)) as targ FROM baf where customername>'a' order by customername asc, inserted desc ", conn);
        SqlDataReader reader;

        reader = sc.ExecuteReader();
        DataTable dt = new DataTable();
        dt.Columns.Add("id", typeof(string));
        dt.Columns.Add("targ", typeof(string));
        dt.Load(reader);


        comboBox1.ValueMember = "id";
        comboBox1.DisplayMember = "targ";
        comboBox1.DataSource = dt;
        conn.Close();



        var select = "SELECT [id],[CustomerName], [email],[CapActual] FROM baf order by id desc";
        var c = new SqlConnection("Data Source=xxxx;Initial Catalog=xxxxx;Integrated Security=True;"); // Your Connection String here
        var dataAdapter = new SqlDataAdapter(select, c);

        var commandBuilder = new SqlCommandBuilder(dataAdapter);
        var ds = new DataSet();
        var bf = new DataTable("BF");
        ds.Tables.Add(bf);

        dataAdapter.Fill(bf);
        dataGridView1.ReadOnly = true;
        dataGridView1.DataSource = bf;






    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {



        var select = "SELECT [id],[CustomerName],[email],[CapActual] FROM baf where id="+comboBox1.SelectedValue+" order by id desc";
        var c = new SqlConnection("Data Source=xxxxx;Initial Catalog=xxxxxx;Integrated Security=True;"); // Your Connection String here
        var dataAdapter = new SqlDataAdapter(select,c);

        var commandBuilder = new SqlCommandBuilder(dataAdapter);
        var ds = new DataSet();
        var bf = new DataTable("BF");
        ds.Tables.Add(bf);

        dataAdapter.Fill(bf);
        dataGridView1.ReadOnly = true;
        dataGridView1.DataSource = bf;










    }

    }




    }

【讨论】:

    【解决方案3】:

    对于有兴趣了解如何使相关代码成功运行的观众,我在下面提供了解决方案。为做好实验准备,对数据进行了硬编码,需要根据实际情况进行修改。

        DataView dataView = null; // <<< Difference #1
    
        private void Form1_Load(object sender, EventArgs e)
        {
            var dt = new DataTable();
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("targ", typeof(string));
    
            dt.Rows.Add("1", "Targ-1");  // example code - remove
            dt.Rows.Add("2", "Targ-2");  // example code - remove
            dt.Rows.Add("3", "Targ-3");  // example code - remove
            dt.Rows.Add("4", "Targ-4");  // example code - remove
    
            comboBox1.ValueMember = "id";
            comboBox1.DisplayMember = "targ";
            comboBox1.DataSource = dt;
    
            var bf = new DataTable("BF");
            bf.Columns.Add("id", typeof(string));  // example code - remove
            bf.Columns.Add("CustomerName", typeof(string));  // example code - remove
            bf.Columns.Add("Email", typeof(string));  // example code - remove
            bf.Columns.Add("Capital", typeof(string));  // example code - remove
    
            bf.Rows.Add("1", "Customer-1", "Email-1", "Capital-1");  // example code - remove
            bf.Rows.Add("1", "Customer-2", "Email-2", "Capital-1");  // example code - remove
            bf.Rows.Add("2", "Customer-3", "Email-3", "Capital-2");  // example code - remove
            bf.Rows.Add("3", "Customer-4", "Email-4", "Capital-3");  // example code - remove
            bf.Rows.Add("3", "Customer-5", "Email-5", "Capital-3");  // example code - remove
            bf.Rows.Add("3", "Customer-6", "Email-6", "Capital-3");  // example code - remove
            bf.Rows.Add("4", "Customer-7", "Email-7", "Capital-4");  // example code - remove
            dataGridView1.ReadOnly = true;
            dataGridView1.DataSource = bf;
    
            dataView = bf.DefaultView;  // <<< Difference #2
            this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);  // <<< Difference #3
        }
    
        void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.Text == "Remove filter")
            {
                dataView.RowFilter = string.Empty;
            }
            else
            {
                dataView.RowFilter = string.Format("id = '{0}'", comboBox1.SelectedValue);   //  <<< Difference #4
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多