Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 全局声明的DataTable已属于另一个数据集_C#_Datatable_Dataset - Fatal编程技术网

C# 全局声明的DataTable已属于另一个数据集

C# 全局声明的DataTable已属于另一个数据集,c#,datatable,dataset,C#,Datatable,Dataset,我在理解一些逻辑方面有困难,但我很高兴知道发生了什么。我有一个应用程序,它使用第三方web服务执行xml并接收响应,这里没有问题。我有一些全局声明的数据集和数据表。我之所以这样做是因为这些数据集和数据表不会改变,但需要从其他方法访问。发生的情况是表单加载,我的DataGridView填充得很好,但是当我从myComboBox中选择不同的日期时,代码抛出一个异常,说明DataTable已经属于另一个数据集。以下是我正在使用的简化示例: public class Test { private B

我在理解一些逻辑方面有困难,但我很高兴知道发生了什么。我有一个应用程序,它使用第三方web服务执行xml并接收响应,这里没有问题。我有一些全局声明的数据集和数据表。我之所以这样做是因为这些数据集和数据表不会改变,但需要从其他方法访问。发生的情况是表单加载,我的DataGridView填充得很好,但是当我从myComboBox中选择不同的日期时,代码抛出一个异常,说明DataTable已经属于另一个数据集。以下是我正在使用的简化示例:

public class Test
{
  private BusinessLayer businessLayer;
  private int id;
  private List<int> employees;
  private DataSet employeeInfoDataSet;
  private DataSet employeesTimeDataSet;
  private DataTable employeeInfoDataTable;
  private DataTable employeesTimeDataTable;

  public Test()
  {
    businessLayer = new BusinessLayer();

    id = 3;

    // these should never change
    // I almost thought about making them static
    employees = businessLayer.getEmployees(id);
    employeeInfoDataSet = businessLayer.getEmployeeInfoDataSet(employees);
    employeeInfoDataTable = businessLayer.getEmployeeInfoDataTable(employeeInfoDataSet);
    employeeInfoDataTable.TableName = "EmployeeInfo";

    string date = myComboBox.SelectedValue.ToString();

    initDataTable(date);
    bindDataGridView();
  }

  private void initDataTable(string date)
  {
    employeesTimeDataSet = businessLayer.getEmployeesTime(employees, date);
    employeesTimeDataSet.Tables.Add(employeeInfoDataTable); // <-- errors here
    employeesTimeDataTable = businessLayer.buildEmployeesTimeDataTable(employeesTimeDataSet);
  }

  private void bindDataGridView()
  {
    dgv.DataSource = timesheetsDataTable;
  }

  private void myComboBox_SelectionChangeCommitted(object sender, EventArgs e)
  {
    string date = myComboBox.SelectedValue.ToString();
    initDataTable(date);
    bindDataGridView();
  }

}
公共类测试
{
私人业务层业务层;
私有int-id;
私人名单雇员;
私有数据集employeeInfoDataSet;
私有数据集employeesTimeDataSet;
私有数据表employeeInfoDataTable;
私有数据表EmployeeEstimatable;
公开考试()
{
businessLayer=新businessLayer();
id=3;
//这些都不应该改变
//我几乎想把它们变成静态的
employees=businessLayer.getEmployees(id);
employeeInfoDataSet=businessLayer.getEmployeeInfoDataSet(员工);
employeeInfoDataTable=businessLayer.getEmployeeInfoDataTable(employeeInfoDataSet);
employeeInfoDataTable.TableName=“EmployeeInfo”;
字符串日期=myComboBox.SelectedValue.ToString();
initDataTable(日期);
bindDataGridView();
}
私有void initDataTable(字符串日期)
{
employeesTimeDataSet=businessLayer.getEmployeesTime(员工,日期);

employeesTimeDataSet.Tables.Add(employeeInfoDataTable);//错误消息是不言自明的,不是吗?您正试图将同一个表添加到另一个
数据集,而您已经将该数据集添加到构造函数中的一个数据集中。您无法添加同一个表(同一引用)到两个不同的
数据集
。那么您想做什么

  • 也许您想检查它是否已经存在于
    数据集中

    if( employeeInfoDataTable.DataSet == null)
        employeesTimeDataSet.Tables.Add(employeeInfoDataTable);
    
  • 也许您首先希望将此表包含到
    数据集中
    ,这似乎是最好的选择(如果可能)

  • 或者,您可能希望在再次创建该表之前从
    数据集
    中删除该表。这样,该表的
    数据集
    属性将被“清除”(您不能分配
    null
    ),您可以稍后将该表添加到新创建的
    数据集

    所以像这样:

    private void initDataTable(string date)
    {
       employeesTimeDataSet.Tables.Remove(employeeInfoDataTable);
       employeesTimeDataSet = businessLayer.getEmployeesTime(employees, date);
       employeesTimeDataSet.Tables.Add(employeeInfoDataTable); // <-- now it works
       employeesTimeDataTable = businessLayer.buildEmployeesTimeDataTable(employeesTimeDataSet);
    }
    
    private void initDataTable(字符串日期)
    {
    employeesTimeDataSet.Tables.Remove(employeeInfoDataTable);
    employeesTimeDataSet=businessLayer.getEmployeesTime(员工,日期);
    
    employeesTimeDataSet.Tables.Add(employeeInfoDataTable);//错误消息是不言自明的,不是吗?您正试图将同一个表添加到另一个
    数据集,而您已经将该数据集添加到构造函数中的一个数据集中。您无法添加同一个表(同一引用)到两个不同的
    数据集
    。那么您想做什么

  • 也许您想检查它是否已经存在于
    数据集中

    if( employeeInfoDataTable.DataSet == null)
        employeesTimeDataSet.Tables.Add(employeeInfoDataTable);
    
  • 也许您首先希望将此表包含到
    数据集中
    ,这似乎是最好的选择(如果可能)

  • 或者,您可能希望在再次创建该表之前从
    数据集
    中删除该表。这样,该表的
    数据集
    属性将被“清除”(您不能分配
    null
    ),您可以稍后将该表添加到新创建的
    数据集

    所以像这样:

    private void initDataTable(string date)
    {
       employeesTimeDataSet.Tables.Remove(employeeInfoDataTable);
       employeesTimeDataSet = businessLayer.getEmployeesTime(employees, date);
       employeesTimeDataSet.Tables.Add(employeeInfoDataTable); // <-- now it works
       employeesTimeDataTable = businessLayer.buildEmployeesTimeDataTable(employeesTimeDataSet);
    }
    
    private void initDataTable(字符串日期)
    {
    employeesTimeDataSet.Tables.Remove(employeeInfoDataTable);
    employeesTimeDataSet=businessLayer.getEmployeesTime(员工,日期);
    
    employeesTimeDataSet.Tables.Add(employeeInfoDataTable);//错误消息是不言自明的,不是吗?您正试图将同一个表添加到另一个
    数据集,而您已经将该数据集添加到构造函数中的一个数据集中。您无法添加同一个表(同一引用)到两个不同的
    数据集
    。那么您想做什么

  • 也许您想检查它是否已经存在于
    数据集中

    if( employeeInfoDataTable.DataSet == null)
        employeesTimeDataSet.Tables.Add(employeeInfoDataTable);
    
  • 也许您首先希望将此表包含到
    数据集中
    ,这似乎是最好的选择(如果可能)

  • 或者,您可能希望在再次创建该表之前从
    数据集
    中删除该表。这样,该表的
    数据集
    属性将被“清除”(您不能分配
    null
    ),您可以稍后将该表添加到新创建的
    数据集

    所以像这样:

    private void initDataTable(string date)
    {
       employeesTimeDataSet.Tables.Remove(employeeInfoDataTable);
       employeesTimeDataSet = businessLayer.getEmployeesTime(employees, date);
       employeesTimeDataSet.Tables.Add(employeeInfoDataTable); // <-- now it works
       employeesTimeDataTable = businessLayer.buildEmployeesTimeDataTable(employeesTimeDataSet);
    }
    
    private void initDataTable(字符串日期)
    {
    employeesTimeDataSet.Tables.Remove(employeeInfoDataTable);
    employeesTimeDataSet=businessLayer.getEmployeesTime(员工,日期);
    
    employeesTimeDataSet.Tables.Add(employeeInfoDataTable);//错误消息是不言自明的,不是吗?您正试图将同一个表添加到另一个
    数据集,而您已经将该数据集添加到构造函数中的一个数据集中。您无法添加同一个表(同一引用)到两个不同的
    数据集
    。那么您想做什么

  • 也许您想检查它是否已经存在于
    数据集中

    if( employeeInfoDataTable.DataSet == null)
        employeesTimeDataSet.Tables.Add(employeeInfoDataTable);
    
  • 也许您首先希望将此表包含到
    数据集中
    ,这似乎是最好的选择(如果可能)

  • 或者,您可能希望在再次创建该表之前从
    数据集
    中删除该表。这样,该表的
    数据集
    属性将被“清除”(您不能分配
    null
    ),您可以稍后将该表添加到新创建的
    数据集

    所以像这样:

    private void initDataTable(string date)
    {
       employeesTimeDataSet.Tables.Remove(employeeInfoDataTable);
       employeesTimeDataSet = businessLayer.getEmployeesTime(employees, date);
       employeesTimeDataSet.Tables.Add(employeeInfoDataTable); // <-- now it works
       employeesTimeDataTable = businessLayer.buildEmployeesTimeDataTable(employeesTimeDataSet);
    }
    
    private void initDataTable(字符串日期)
    {
    employeesTimeDataSet.Tables.Remove(employeeInfoDataTable);
    employeesTimeDataSet=总线