在以DataSet为边界的datagridview中过滤数据

时间:2018-10-15 18:53:39

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

我已将数据从datagridview绑定到DataSet,并且正在尝试过滤 datagridview事件中textchange中的这些有界数据

时,我遇到了两个问题
  1. 除了可以删除自定义datagridview标头并设置查询列的名称外,我开始键入它时效果很好。标题为“名字”,由“ NAM”代替,NAM是数据库中的列名...

  2. 当我进入其他部分时,第二个问题不会重新限制并抛出我错过的异常?

    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;
        }
    }

2 个答案:

答案 0 :(得分:2)

AutoGenerateColumns设置为false。

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

答案 1 :(得分:1)

使用绑定到数据集的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,设计师将进行所有设置。然后,您所需要做的就是选择一个合适的位置以向其加载数据,并应用文本更改的处理程序(我在上面放置了5行代码)

我知道这将很困难,将您花了很多时间将所有的代码都丢掉。.但这总是令人头疼,并且永远不会正确,因为这显然是错误的处理方式数据和绑定控件