Как я могу добавить новый столбец и данные в таблицу данных, которая уже содержит данные?

Как добавить новый DataColumn к объекту DataTable, который уже содержит данные?

Псевдокод

//call SQL helper class to get initial data 
DataTable dt = sql.ExecuteDataTable("sp_MyProc");

dt.Columns.Add("NewColumn", type(System.Int32));

foreach(DataRow row in dr.Rows)
{
    //need to set value to NewColumn column
}

person Michael Kniskern    schedule 22.02.2010    source источник


Ответы (5)


Просто продолжайте работать со своим кодом — вы на правильном пути:

//call SQL helper class to get initial data 
DataTable dt = sql.ExecuteDataTable("sp_MyProc");

dt.Columns.Add("NewColumn", typeof(System.Int32));

foreach(DataRow row in dt.Rows)
{
    //need to set value to NewColumn column
    row["NewColumn"] = 0;   // or set it to some other value
}

// possibly save your Dataset here, after setting all the new values
person marc_s    schedule 22.02.2010
comment
Вам нужно было вызвать dt.AcceptChanges() после того, как я добавил новый столбец и значение? - person Michael Kniskern; 22.02.2010
comment
@Майкл: нет, не совсем. Ваш набор данных теперь подготовлен с этими новыми значениями. Если вы хотите сохранить его, вам нужен какой-то метод для его обратной записи (через SqlDataAdapter или каким-то другим способом). AcceptChanges() ничего не сделает (кроме того, что пометит эти изменения как принятые —> они не будут обнаружены для сохранения при следующем сохранении ваших данных!) - person marc_s; 22.02.2010

Разве не должно быть foreach вместо for!?

//call SQL helper class to get initial data  
DataTable dt = sql.ExecuteDataTable("sp_MyProc"); 

dt.Columns.Add("MyRow", **typeof**(System.Int32)); 

foreach(DataRow dr in dt.Rows) 
{ 
    //need to set value to MyRow column 
    dr["MyRow"] = 0;   // or set it to some other value 
} 
person Imir Hoxha    schedule 06.01.2012

Только вы хотите установить параметр значения по умолчанию. Это вызов третьего метода перегрузки.

dt.Columns.Add("MyRow", type(System.Int32),0);
person Nishantha    schedule 18.02.2015

Вот альтернативное решение для уменьшения цикла For/ForEach, это уменьшит время цикла и быстро обновит :)

 dt.Columns.Add("MyRow", typeof(System.Int32));
 dt.Columns["MyRow"].Expression = "'0'";
person Akxaya    schedule 02.03.2015
comment
@Akxaya, не могли бы вы рассказать, как работает это решение? - person Mikael Dúi Bolinder; 14.01.2019
comment
DataTable dt = sql.ExecuteDataTable(sp_MyProc); // dt.Columns.Add(MyRow, typeof(System.Int32)); dt.Columns[MyRow].Expression = '0'; - person Akxaya; 26.02.2020

Попробуйте это

> dt.columns.Add("ColumnName", typeof(Give the type you want));
> dt.Rows[give the row no like  or  or any no]["Column name in which you want to add data"] = Value;
person Himanshu Shukla    schedule 14.07.2015