【问题标题】:Datatable merge and rejectchanges not working as intended数据表合并和拒绝更改未按预期工作
【发布时间】:2017-03-10 07:13:56
【问题描述】:

我正在开发一个包含 2 个类似数据网格的 winform,每个数据网格都将其数据源设置为同一张表的不同实例。出于测试目的,表格中既有不同的记录也有相似的记录,每条记录填充不同的单元格。

1- 调用 Datatable.Merge 时,目标表获取丢失的行,但初始行没有从源表的相应单元格更新其空单元格。

2- 在目标表上调用 Datatable.RejectChanges 时,合并添加的行没有被删除,这是一个问题,但是这一次,初始行的空单元格从相应的单元格中正确更新源表,我希望在合并时发生。

用于填表的函数:

private bool OpenFile(Datatable table)
{
    if (OFD.ShowDialog() == DialogResult.OK) // OFD is OpenFileDialog
    {
        if (UserPrompt.ShowDialog() == DialogResult.OK) // UserPrompt is a custom input dialog for user credentials
        {
            try
            {
                // code to fill table not shown for readability, works well anyway
                table.AcceptChanges(); // otherwise all the records are deleted after RejectChanges, including the initial ones                        
                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Operation Canceled", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }

    return false;
}

合并函数:

private void menuMerge1_Click(object sender, EventArgs e)
{
    Table1.Merge(Table2, true);
    if (MessageBox.Show("Table 2 merged to table 1. Save changes? Choosing no will cancel the merging.", "Keep or Discard Changes", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.OK)
        Save(Table1); // saving to file, custom function
    else Table1.RejectChanges();
}

先调用OpenFile函数,再调用merge,就这样了。

我试过了:

  • 刷新 DataGridView。
  • 重置 DataGridView 的 DataSource。
  • 合并后在目标上调用 AcceptChanges。

提前感谢您的任何见解!

【问题讨论】:

  • 我更好的方法是先询问用户然后进行合并,而不是其他方式。您将为大型表节省宝贵的处理器时间。
  • @Abdul Rehman 说:是的。一旦找到合并表格的可靠方法,我将立即更改它:)

标签: c# winforms datatable


【解决方案1】:

好的,首先,DataTable.Merge 不会引发事件,这意味着 RejectChanges 只会对修改的行起作用,添加的行被标记为未更改。解决方案是编写自定义合并函数。假设 PK 是第一个单列,适用于类似的表:

    private bool Merge(DataTable target, DataTable source, bool preserve)
    {           
        if (!preserve)
        {
            target.Merge(source, false);
            return true;
        }            
        else
        {
            DataRow drTargetMatch;
            DataRow drNew;
            int numCol = source.Columns.Count;
            int index = 1;

            try
            {
                foreach (DataRow dr in source.Rows)
                {
                    drTargetMatch = target.Rows.Find(dr[0]);
                    if (drTargetMatch == null) // source row does not exist in target, add a copy
                    {
                        drNew = target.NewRow();
                        drNew.ItemArray = dr.ItemArray;
                        target.Rows.Add(drNew);
                    }
                    else // source row exists in target, update empty values
                    {
                        for (index = 1; index < numCol; index++) // start at 1 since we don't update PK
                        {
                            if (drTargetMatch.IsNull(index) && !dr.IsNull(index))
                                drTargetMatch[index] = dr[index];                                
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Operation Canceled", MessageBoxButtons.OK, MessageBoxIcon.Error);
                target.RejectChanges();
                return false;
            }

            return true;
        }                        
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多