1、DataGridView数据绑定对比(DataTable与泛型List):
当DataGridView的DataSource是DataTable的时候,DataTable的数据改变时,DataGridView的数据会随之改变,无需重新绑定到DataGridView。
当DataGridView的DataSource是泛型List,当List的数据改变时,则需要先将DataGridView的DataSource设置为new List<T>(),再将改变后的List<T>赋给DataGridView的DataSource。
绑定List时,注意:切莫将DataGridView的DataSource设置为Null,否则会破坏DataGridView的列结构。
示例代码如下:
使用DataTable的绑定的例子,无需使用DataTable重新进行数据绑定,可以直接改变DataGridView单元格中的CheckBox的值,能实时同步显示改变的结果。
private void SearchByNoRange() { GlobalData.codeDate = Convert.ToDateTime(txtCodeDate.Text.Trim()); GlobalData.startSerialNumber = Convert.ToInt32(txtStartSerialNumber.Text.Trim()); GlobalData.endSerialNumber = Convert.ToInt32(txtEndSerialNumber.Text.Trim()); string sql = string.Empty; if (chkSearchType.Checked) { if (cboSearchType.SelectedIndex == 0) { MessageBox.Show("请选择你要搜索的条件!", "搜索提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { if (rdoBtnAll.Checked) { switch (cboSearchType.Text.Trim()) { case "姓名": sql = string.Format("select CodeDate,SerialNumber,Name,Sex,Nation,Birthday,OnlyRead from ExaminateInfo where CodeDate= CDate('{0}') and SerialNumber between {1} and {2} and Name like '%{3}%' order by CodeDate,SerialNumber", GlobalData.codeDate, GlobalData.startSerialNumber, GlobalData.endSerialNumber, txtSearchContent.Text.Trim()); break; case "用户ID": sql = string.Format("select CodeDate,SerialNumber,Name,Sex,Nation,Birthday,OnlyRead from ExaminateInfo where CodeDate= CDate('{0}') and SerialNumber between {1} and {2} and UserID={3} order by CodeDate,SerialNumber", GlobalData.codeDate, GlobalData.startSerialNumber, GlobalData.endSerialNumber, GlobalData.userID); break; case "工作单位或住址": sql = string.Format("select CodeDate,SerialNumber,Name,Sex,Nation,Birthday,OnlyRead from ExaminateInfo where CodeDate= CDate('{0}') and SerialNumber between {1} and {2} and Address='{3}' order by CodeDate,SerialNumber", GlobalData.codeDate, GlobalData.startSerialNumber, GlobalData.endSerialNumber, txtSearchContent.Text.Trim()); break; default: break; } } else { switch (cboSearchType.Text.Trim()) { case "姓名": sql = string.Format("select CodeDate,SerialNumber,Name,Sex,Nation,Birthday,OnlyRead from ExaminateInfo where CodeDate= CDate('{0}') and SerialNumber between {1} and {2} and OnlyRead={3} and Name like '%{4}%' order by CodeDate,SerialNumber", GlobalData.codeDate, GlobalData.startSerialNumber, GlobalData.endSerialNumber, rdoBtnChecked.Checked, txtSearchContent.Text.Trim()); break; case "用户ID": sql = string.Format("select CodeDate,SerialNumber,Name,Sex,Nation,Birthday,OnlyRead from ExaminateInfo where CodeDate= CDate('{0}') and SerialNumber between {1} and {2} and OnlyRead={3} and UserID={4} order by CodeDate,SerialNumber", GlobalData.codeDate, GlobalData.startSerialNumber, GlobalData.endSerialNumber, rdoBtnChecked.Checked, GlobalData.userID); break; case "工作单位或住址": sql = string.Format("select CodeDate,SerialNumber,Name,Sex,Nation,Birthday,OnlyRead from ExaminateInfo where CodeDate= CDate('{0}') and SerialNumber between {1} and {2} and OnlyRead={3} and Address='{4}' order by CodeDate,SerialNumber", GlobalData.codeDate, GlobalData.startSerialNumber, GlobalData.endSerialNumber, rdoBtnChecked.Checked, txtSearchContent.Text.Trim()); break; default: break; } } } } else { if (rdoBtnAll.Checked) { sql = string.Format("select CodeDate,SerialNumber,Name,Sex,Nation,Birthday,OnlyRead from ExaminateInfo where CodeDate= CDate('{0}') and SerialNumber between {1} and {2} order by CodeDate,SerialNumber", GlobalData.codeDate, GlobalData.startSerialNumber, GlobalData.endSerialNumber); } else { sql = string.Format("select CodeDate,SerialNumber,Name,Sex,Nation,Birthday,OnlyRead from ExaminateInfo where CodeDate= CDate('{0}') and SerialNumber between {1} and {2} and OnlyRead={3} order by CodeDate,SerialNumber", GlobalData.codeDate, GlobalData.startSerialNumber, GlobalData.endSerialNumber, rdoBtnChecked.Checked); } } DataTable dt = DbHelperACE.Query(sql).Tables[0]; DataTable transDataTable = TransDataTable(dt); dgvExaminateInfo.DataSource = transDataTable; lblSearchResult.Text = string.Format("查询结果:当前查询到【{0}】条记录信息!", dt.Rows.Count); } private void chkAllSelect_CheckedChanged(object sender, EventArgs e) { foreach (DataGridViewRow item in dgvExaminateInfo.Rows) { item.Cells["SelectStatus"].Value = chkAllSelect.Checked; } }
下面的代码是使用List<T>泛型集合的示例代码,需要重新进行数据绑定:
private void chkAllChecked_CheckedChanged(object sender, EventArgs e) { if (chkAllChecked.Checked) { for (int i = 0; i < treatmentEntityList.Count; i++) { treatmentEntityList[i].IsChecked = true; } } else { for (int i = 0; i < treatmentEntityList.Count; i++) { treatmentEntityList[i].IsChecked = false; } } List<TreatmentEntity> treatmentEntityPagerList = new List<TreatmentEntity>(); for (int i = (pageIndex - 1) * pageSize; i < pageIndex * pageSize; i++) { treatmentEntityPagerList.Add(treatmentEntityList[i]); } dgvOutpatientPricing.DataSource = treatmentEntityPagerList; //当DataGridView的DataSource是DataTable的时候,DataTable的数据改变时,DataGridView的数据会随之改变,无需重新绑定到DataGridView。 //当DataGridView的DataSource是泛型List,当List的数据改变时,则需要先将DataGridView的DataSource设置为new List<T>(),再将改变后的List<T>赋给DataGridView的DataSource //下面的代码不能改变CheckBox列值的改变,只能用上面的代码 //foreach (DataGridViewRow item in dgvOutpatientPricing.Rows) //{ // item.Cells["Col_IsChecked"].Value = chkAllChecked.Checked; //} //for (int i = 0; i < this.dgvOutpatientPricing.Rows.Count; i++) // this.dgvOutpatientPricing.Rows[i].Cells["Col_IsChecked"].Value = chkAllChecked.Checked; }
2、数据绑定后的添加删除问题:
如果要对绑定在DataGridView中的List<T>进行数据的添加删除,先要把List<T>转换成BindingList<T>,再进行绑定:DataGridView.DataSource=new BindingList<T>(new List<T>)。否则的话会产生许多意想不到的错误。
如:初始绑定空数据后再添加数据绑定后,却取不到DataGridView.CurrentCell属性。
3、使用泛型绑定依然可以添加删除:
DataGridView.DataSource=list;//DataGridView的行不能添加删除
DataGridView.DataSource=new BindingList<T>(list);//DataGridView的行可以添加删除(只有允许添加行、删除行)