文章类型: .NET
关键词: DataGridview,绑定泛型,List,DataTable,BindingList
内容摘要: DataGridView数据绑定对比(DataTable与泛型List),数据绑定后的添加删除问题,使用泛型绑定依然可以添加删除n

DataGridview 绑定泛型List、BindingList与DataTable的注意要点

2016/2/4 20:59:42    来源:apple    阅读:

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、使用泛型绑定依然可以添加删除:
IList<T> list= new List<T>();
DataGridView.DataSource=list;//DataGridView的行不能添加删除
DataGridView.DataSource=new BindingList<T>(list);//DataGridView的行可以添加删除(只有允许添加行、删除行)


↑ 上一篇文章:datagridview中使用checkbox列,修改checkbox状态时如何实时获得其状态值 关键词:datagridview,checkbox,列,修改ch.. 发布日期:2016/2/4 20:53:08
↓ 下一篇文章:过滤的DataGridView在不改变数据源的分析 关键词:c#,winforms,visual,studio,da.. 发布日期:2016/2/4 21:34:48
相关文章:
c#的WinForm开发中控件DataGridView的嵌套绑定解决办法 关键词:c#,WinForm,DataGridView,嵌套绑定,解决办法 发布日期:2016-01-27 01:55
C#中的DataGridView使用“属性.属性”绑定数据 关键词:C#,DataGridView,使用,属性.属性,绑定数据 发布日期:2015-07-18 12:09
C#中DataGridView的多表数据展示的方法总结 关键词:C#,DataGridView,多表数据,展示,方法,总结 发布日期:2015-07-18 12:01
相关目录:.NET
我要评论
正在加载评论信息......