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