2012-08-22 17 views
5

Với mã này:Tại sao một DataRow được nhận diện trong một phần của một phương thức nhưng không được nhận dạng khác (làm thế nào để tôi có thể tự động thêm DataRows)?

OracleDataTable dt = PlatypusSchedData.GetAvailablePlatypi(); 
OracleDataTable outputDt = new OracleDataTable(); 

int iRows = 12; 
while (iRows > 0) 
{ 
    outputDt.Rows.Add(new DataRow()); // line 1 
    //var dr = new DataRow();  // line 2a 
    //outputDt.Rows.Add(dr);  // line 2b 
    iRows -= 1; 
} 

for (int i = 0; i < dt.Rows.Count; i += 1) { 
    DataRow dr = dt.Rows[i]; 
    int outputColumn = 0; 
    if (i % 12 == 0 && i > 0) { 
     outputColumn += 1; //2? 
    } 
    outputDt.Rows[i % 12][outputColumn] = dr[0]; 
    outputDt.Rows[i % 12][outputColumn + 1] = dr[1]; 
} 
dataGridView1.DataSource = outputDt; 

... Tôi nhận được lỗi thời gian biên dịch này bằng cách sử dụng dòng 1 (dòng 2a và 2b nhận xét ra) hoặc sử dụng dòng 2a và 2b (với dòng 1 nhận xét ra):

'System.Data.DataRow.DataRow (System.Data.DataRowBuilder)' là không thể tiếp cận do mức độ bảo vệ của nó

này được baffling tôi vì DataRow trong vòng lặp for được dung thứ. Làm thế nào tôi có thể thêm các DataRows này vào OracleDataTable của tôi?

Trả lời

19

Hàm tạo cho DataRow được đánh dấu là protected internal và do đó, bạn không thể trực tiếp xây dựng nó.

Mã đúng để có được một hàng mới cho một DataTable

DataRow dr = dt.NewRow(); 
3

Tôi không quen thuộc với OracleDataTable nhưng tôi cho rằng nó được thừa hưởng từ một bình thường DataTable.

Bạn không thể tạo trực tiếp DataRow vì hàm tạo là protected. Thay vào đó, bạn phải sử dụng một trong các phương pháp nhà máy như DataTable.Rows.Add hoặc DataTable.NewRow. Điều này đảm bảo rằng lược đồ chính xác được áp dụng trên DataRow mới bởi vì nó được xác định từ DataTable của nó.

Vì vậy, điều này sẽ hoạt động:

while (iRows > 0) 
{ 
    DataRow dr = outputDt.NewRow(); 
    // fill the fields of the row ... 
    // add it to the DataTable: 
    outputDt.Rows.Add(dr); 
    iRows -= 1; 
}