2014-09-10 2 views
1

EDIT: Извините, ребята, я был немного слеп с этой штукой, я разместил «решение» ниже под «проблемой».C# Добавить строки/столбцы в существующий DataTable по отдельному методу

ORIGINAL:

Я не могу показаться, чтобы получить за эту проблему (даже после поиска много на SO): У меня есть DataTable объект, который я хочу, чтобы «подготовить» для населения данных следующим образом:

Моя модель класса собственности (имя_класса "DataMdl"):

private static DataTable _datatbl; 
    public DataTable datatbl 
    { 
     get { return _datatbl; } 
     set 
     { 
      _datatbl = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("datatbl")); 
     } 
    } 

Зов prepdatatable в ViewModel-метод:

prepdatatable(DataMdl.datatbl, 5, 9) 

Мой prepdatatable метод:

private void prepdatatable(DataTable dt, int rowcount, int colcount) 
    { 
     dt = new DataTable(); 

     int i = 0; 

     for (i = 0; i < colcount; i++) 
     { 
      dt.Columns.Add("col" + i); 
     } 

     for (i = 0; i < rowcount; i++) 
     { 
      dt.Rows.Add("row" + i); 
     } 
    } 

После вызова выше метод, который я пытаюсь заполнить DataTable в методе, который под названием prepdatatable с

DataMdl.datatbl.Rows[0][0] = "..." 
    DataMdl.datatbl.Rows[0][1] = "..." 
    ... 
    DataMdl.datatbl.Rows[1][0] = "..." 
    ... 
    and so on 

В этом случае я получаю NullReferenceException на DataMdl.datatbl ,

Когда я пытаюсь инициализировать DataMdl.datatbl за пределами prepdatatable, я получаю исключение NullReferenceException внутри «dt» внутри prepdatatable.

"РЕШЕНИЕ": Просто сделайте prepdatatable Вернуть DataTable вместо пустоты, а затем присвоить его значение свойству DataMdl.datatbl:

private DataTable prepdatatable(int rowcount, int colcount) 
    { 
     var dt = new DataTable(); 

     int i = 0; 

     for (i = 0; i < colcount; i++) 
     { 
      dt.Columns.Add("col" + i); 
     } 

     for (i = 0; i < rowcount; i++) 
     { 
      dt.Rows.Add("row" + i); 
     } 

     return dt; 
    } 

и

DataMdl.datatbl = prepdatatable(5, 9); 

Спасибо за ваш интерес.

+1

Где Вы получаете это исключение? Является 'datatbl = new DataTable();' единственным местом, где вы инициализируете таблицу, прежде чем передавать ее методу? –

+0

Вы правильно добавляете строки и столбцы. Я думаю, что вы передаете 'null' вместо datatable к этому методу. –

+1

_" EDIT: "datatbl" является свойством моего класса модели. "_ Затем покажите соответствующий реальный код вместо кода, который работает. Мы не можем исправить проблему, которая не существует. –

ответ

0

Что вы здесь делаете?

for (i = 0; i < rowcount; i++) 
    { 
     var r = dt.NewRow(); 
     dt.Rows.Add(r); 
    } 

У меня такое ощущение, что это источник исключения. Взгляните на это: How to add a new row to c# DataTable in 1 line of code?. Кажется, вы пытаетесь добавить строку, которая не имеет значения. Новая строка по умолчанию имеет значение null, но инициализируется. Затем вы пытаетесь добавить его в datatable. Почему бы вам не добавить строки, как вы добавляете столбцы?

0

предположить, что это инициализация вашего DataTable и здесь вы вызываете метод

datatbl = new DataTable(); 
prepdatatable(datatbl, 5, 9); 

этот метод не будет брать DataTable, он будет делать копии с него, вы отправляете DataTable значения а не по ссылке

private void prepdatatable(DataTable dt, int rowcount, int colcount) 
    { 
     int i = 0; 

     for (i = 0; i < colcount; i++) 
     { 
      dt.Columns.Add("col" + i); 
     } 

     for (i = 0; i < rowcount; i++) 
     { 
      var r = dt.NewRow(); 
      dt.Rows.Add(r); 
     } 
    } 

Я полагаю, что ваш метод должен работать нормально, и проблема только в параметре представляемого пути просто изменить метод вызов на

prepdatatable(ref datatbl, 5, 9); 

заголовок к

private void prepdatatable(ref DataTable dt, int rowcount, int colcount) 
+0

Большое спасибо. Да, я думал, что это должно быть что-то вроде этого, к сожалению, я получаю сообщение о том, что свойство не может быть передано как ссылка. – ChocoCaballero

+0

Вы меня на правильном пути, хотя, я разместил мое «решение» выше. – ChocoCaballero

+0

приятно слышать, что – Ateeq

Смежные вопросы