步骤: 1.绑定datatable和datagridview 2. 在界面上对datagridview排序,并在dataGridView1_Sorted事件中对datatable进行排序,用dataview.totable()方法将排序后的数据赋给datatable
3. 测试绑定是否继续有效
步骤一代码:
Code
private void button1_Click(object sender, EventArgs e) //绑定数据
{
this.dtTemp = SqlHelper.ExecuteDataset("server=.;uid=sa;pwd=123;database=pubs;",CommandType.Text,"select * from jobs").Tables[0];
this.bs.DataSource = this.dtTemp;
this.dataGridView1.DataSource = this.bs;
} 步骤二代码:
Code
private void dataGridView1_Sorted(object sender, EventArgs e) //重新对datatable进行排序
{
string sortStr = this.dataGridView1.SortedColumn.Name;
if (this.dataGridView1.SortOrder == SortOrder.Ascending)
{
sortStr += " asc";
}
else
{
sortStr += " desc";
}
//原方法: this.dtTemp手动增加一行后,this.dataGridView1不会增加一行,绑定失效
this.dtTemp.DefaultView.Sort = sortStr;
this.dtTemp = this.dtTemp.DefaultView.ToTable();
//新方法: 不会导致绑定失效
DataTable _dt = this.dtTemp.Clone();
DataRow[] drs = this.dtTemp.Select(string.Empty, sortStr);
foreach (DataRow var in drs)
{
_dt.ImportRow(var);
}
this.dtTemp.Clear();
foreach (DataRow var in _dt.Rows)
{
this.dtTemp.ImportRow(var);
}
} 步骤三代码:
Code
private void button2_Click(object sender, EventArgs e) //测试datatable新增行后,datagridview是否新增行
{
DataRow dr = this.dtTemp.NewRow();
this.dtTemp.Rows.Add(dr);
int i = this.dtTemp.Rows.Count;
int j = this.dataGridView1.Rows.Count;
} 原因分析:个人认为的原因: 在MSDN中队dataview.ToTable()方法的说明是:根据现有 DataView 中的行,创建并返回一个新的 DataTable。
问题可能就出在返回一个新的datatable上,新datatable的分配的内存和原有datatable不一样,导致绑定失效.这只是我个人观点,大家有什么看法可以讨论一下.