【问题标题】:Filter data within datagridview bounded from DataSet过滤从 DataSet 界定的 datagridview 中的数据
【发布时间】:2018-10-15 18:53:39
【问题描述】:

我有从DataSetdatagridview的有界数据,我正在尝试过滤 在textchange 事件中datagridview 内的这些有界数据 我遇到了两个问题

  1. 我开始输入它工作正常,只是它删除了自定义 datagridview 标题并设置查询前列的名称。标题是“名字”,它被替换为“NAM”,这是数据库中的列名......

  2. 第二个问题,当我进入 else 部分时,它不会重新绑定并抛出我错过的异常?

    public DataSet GetPatientList()
    {
        string connStr = ConfigurationManager.ConnectionStrings["SRJDconnstr"].ToString();
        string cmdStr = @"SELECT ROW_NUMBER()OVER(ORDER BY ID) AS SEQ,
                                                 ID,
                                                 DocNUM,
                                                 NAM,
                                                 FNAME,
                                                 LFNAME,
                                                 PHONE,
                                                 MOBILE,
                                                 SEX,
                                                 BIRTHDAY,
                                                 ADDRESS,
                                                 ENDATETIME
                                            FROM SICK
                                     ORDER BY ENDATETIME ASC;";
    
        SqlConnection conn = new SqlConnection(connStr);
        using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
        {
                conn.Open();
                cmd.CommandText = cmdStr;
                cmd.CommandType = CommandType.Text;
    
                ds = new DataSet();
                da = new SqlDataAdapter(cmd);
    
                da.Fill(ds, "PatientList");
    
                DGV_PatientList.Columns["DGV_PatientList_RowNum"].DataPropertyName = ds.Tables["PatientList"].Columns["SEQ"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_PatientID"].DataPropertyName = ds.Tables["PatientList"].Columns["ID"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_DocNUM"].DataPropertyName = ds.Tables["PatientList"].Columns["DocNUM"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_FirstName"].DataPropertyName = ds.Tables["PatientList"].Columns["NAM"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_FatherName"].DataPropertyName = ds.Tables["PatientList"].Columns["FNAME"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_LastName"].DataPropertyName = ds.Tables["PatientList"].Columns["LFNAME"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_Phone"].DataPropertyName = ds.Tables["PatientList"].Columns["PHONE"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_Mobile"].DataPropertyName = ds.Tables["PatientList"].Columns["MOBILE"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_Gender"].DataPropertyName = ds.Tables["PatientList"].Columns["SEX"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_Birthday"].DataPropertyName = ds.Tables["PatientList"].Columns["BIRTHDAY"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_Address"].DataPropertyName = ds.Tables["PatientList"].Columns["ADDRESS"].ColumnName;
                DGV_PatientList.Columns["DGV_PatientList_EntryDate"].DataPropertyName = ds.Tables["PatientList"].Columns["ENDATETIME"].ColumnName;
    
                return ds;
        }
    }
    

文本更改事件

    private void TB_FirstName_TextChanged(object sender, EventArgs e)
    {
        if (!string.IsNullOrWhiteSpace(TB_FirstName.Text))
        {
            // first try below
            (ds.Tables["PatientList"] as DataTable).DefaultView.RowFilter = string.Format("NAM LIKE '%{0}%'", TB_FirstName.Text);
            // second try below
            //ds.Tables["PatientList"].DefaultView.RowFilter = string.Format("NAM LIKE '%{0}%'", TB_FirstName.Text);
        }
        else
        {
            DGV_PatientList.DataSource = GetPatientList();
            DGV_PatientList.DataSource = ds.Tables["PatientList"].DefaultView;
        }
    }

【问题讨论】:

  • 有什么异常?
  • @MrZander 对象引用未设置为 DGV_PatientList.Columns["DGV_PatientList_RowNum"].DataPropertyName = ds.Tables["PatientList"].Columns["SEQ"] 行上的对象实例。列名; `

标签: c# visual-studio-2013 datagridview .net-4.0


【解决方案1】:

AutoGenerateColumns 设置为 false。

这就是导致名称更改的原因,也是您收到异常的原因。这些列不再存在,您正在按名称引用它们。

【讨论】:

  • 感谢它现在可以工作,但发生了一个奇怪的问题,并非所有文本框都是 textchange 事件正在工作!
  • 感谢它现在可以工作,但发生了一个奇怪的问题,并非所有文本框都是 textchange 事件正在工作!
【解决方案2】:

使用绑定到数据集的 DataGridView 不应该这么难 - 您一定一直在学习一个非常古老或写得不好的教程

这一切都应该挂在一起的方式更加整洁紧凑:

//in your code that handles loading the grid with data, e.g. in a Load button handler

  patientListTableAdapter.Fill(ds.PatientList); //strongly typed dataset, table is already bound to grid in design time. 
//Visual Studio binds it fully for you when you add it to the form, in the designer
//you never again mess with the bindings, just fill and empty the table: MVC


private void TB_FirstName_TextChanged(object sender, EventArgs e){

  if(string.IsNullOrWhiteSpace(TB_FirstName.Text)
    patientListBindingSource.Filter = null;
  else
    patientListBindingSource.Filter = string.Format("NAM LIKE '%{0}%'", TB_FirstName.Text);
}

是的...只需 5 行代码就可以完成您在此处尝试实现的所有目标。现在,您以不正确的方式使用这些技术,并获得了困难且性能不佳的结果。

有关如何使用数据表的指导,请参阅 MSDN: https://msdn.microsoft.com/en-us/library/fxsa23t6.aspx

从“创建一个简单的数据应用程序”开始,创建一个新项目,按照这些步骤创建一个新的示例应用程序。完成后,我建议回到现有应用程序,不尝试挽救已经完成的工作 - 删除该批次,从表单中删除 datagridview,创建一个新的类型化数据集,将其链接到您的数据库,在您的表单上放置一个新的正确绑定的 datagridview,然后设计器将设置所有内容。然后你需要做的就是选择一个合适的地方来加载数据,并应用一个 textchanged 处理程序(我上面放的 5 行代码)

我知道这会很困难,扔掉你倾注了血汗和泪水的所有代码.. 但这总是令人头疼,而且永远无法正常工作,因为这显然是错误的工作方式数据和绑定控件

【讨论】:

    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 2015-01-21
    • 2012-02-27
    • 2011-06-15
    • 2010-11-18
    • 1970-01-01
    • 2016-12-30
    • 2014-08-05
    相关资源
    最近更新 更多