我已将数据从datagridview
绑定到DataSet
,并且正在尝试过滤
datagridview
事件中textchange
中的这些有界数据
除了可以删除自定义datagridview
标头并设置查询列的名称外,我开始键入它时效果很好。标题为“名字”,由“ NAM”代替,NAM是数据库中的列名...
当我进入其他部分时,第二个问题不会重新限制并抛出我错过的异常?
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;
}
}
答案 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行代码)
我知道这将很困难,将您花了很多时间将所有的代码都丢掉。.但这总是令人头疼,并且永远不会正确,因为这显然是错误的处理方式数据和绑定控件