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的行可以添加删除(只有允许添加行、删除行)