2012-02-09 61 views
1

我有這樣的代碼爲什麼在我的數據錶行中沒有更新該值?

foreach (DataRow row in dt.Rows) 
{ 
    Debug.WriteLine("Start of Row"); 
    for (int i = 0; i < row.ItemArray.Length; i++) 
    { 
    string val = row.ItemArray[i].ToString(); 
    row.ItemArray[i] = "My New Value"; 

    Debug.WriteLine("val: {0}, new: {1}", val, row.ItemArray[i].ToString()); 
    } 
} 

但從來沒有得到更新的價值。我不知道爲什麼。

Start of Row 
val: 2/02/2012, new: 2/02/2012 
val: ac, new: ac 
val: ac, new: ac 
val: 515.00, new: 515.00 

編輯

一些更多的嘗試

for (int i = 0; i < dt.Rows.Count; i++) 
      { 
       DataRow row = dt.Rows[i]; 
       for (int x = 0; x < row.ItemArray.Length; x++) 
       { 
        string val = row.ItemArray[x].ToString(); 
        row.ItemArray.SetValue("My New Value", x); 

        Debug.WriteLine("val: {0}, new: {1}", val, row.ItemArray[x].ToString()); 
       } 
      } 

val: 2/02/2012, new: 2/02/2012 
val: ac, new: ac 
val: ac, new: ac 
val: 515.00, new: 515.00 

闖闖

for (int i = 0; i < dt.Rows.Count; i++) 
      { 
       DataRow row = dt.Rows[i]; 
       for (int x = 0; x < row.ItemArray.Length; x++) 
       { 
        string val = row.ItemArray[x].ToString(); 
        row[i] = "My New Value"; 

        Debug.WriteLine("val: {0}, new: {1}", val, row.ItemArray[x].ToString()); 
       } 
      } 

給我

System.Data.ReadOnlyException was unhandled by user code 
    Message=Column 'Date' is read only. 
    Source=System.Data 
    StackTrace: 
     at System.Data.DataRow.set_Item(DataColumn column, Object value) 
     at System.Data.DataRow.set_Item(Int32 columnIndex, Object value) 
     at CCRecomendator.Framework.Services.CreditCardRecommendatorService.ParseTransactions(Stream stream) in 
     at CCRecomendator.WebUI.Controllers.RecommendController.UploadTransactions(HttpPostedFileBase file) in 
     at lambda_method(Closure , ControllerBase , Object[]) 
     at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
    InnerException: 

所以也許這些東西是隻讀或東西?

我正在使用filehelpers它正在創建數據表,它是行。不知道它是否在做一些讓我無法做我想做的事的時髦。

回答

6

相反ItemArray,只需訪問索引:

foreach (DataRow row in dt.Rows) 
{ 
    Debug.WriteLine("Start of Row"); 
    for (int i = 0; i < row.ItemArray.Length; i++) 
    { 
    string val = row[i].ToString(); 
    row[i] = "My New Value"; 

    Debug.WriteLine("val: {0}, new: {1}", val, row[i].ToString()); 
    } 
} 
+0

感謝您發佈此信息。我從來沒有見過ItemArray。打算髮布,好吧,這個。 :) – 2012-02-09 22:30:44

+0

看我的編輯。給我一個只讀錯誤。 – chobo2 2012-02-09 22:32:21

+0

@ chobo2這對我的測試有效。鑑於你的錯誤,你的「列」被設置爲「ReadOnly = True」。所以你需要關閉它,或者顯然不要嘗試改變只讀列。 – LarsTech 2012-02-09 22:36:27

1

這是foreach循環的缺點,你不能修改集合的內容,因爲它的作用域只限於循環內部。您可能需要使用常規循環。根據此microsoft documentforeach語句用於遍歷集合以獲取所需信息,但不應用於更改集合的內容以避免不可預知的副作用」。

+0

嗯,即使你有一個for循環裏面通過另一個集合。當你嘗試在foreach循環中改變一個值時,它通常會抱怨 – chobo2 2012-02-09 22:24:00

+0

是的,將上面的foreach改爲常規for循環並嘗試。 – kosa 2012-02-09 22:26:04

+0

不,這不是我的問題。發生的其他事情正在阻止它。 – chobo2 2012-02-09 22:32:46

0

你得到同樣的結果,如果你使用

的Debug.WriteLine( 「VAL:」 + VAL + 「新的」 + row.ItemArray [I]的ToString());

嘗試進行任何更改

dt.Rows [I] .ReadOnly =假

或細胞僅

dt.Rows之前這個

for (i=0; i< dt.Rows.Count ; i++) 
{ 
    Debug.WriteLine("Start of Row"); 
    for (int j = 0; j < dt.Rows[i].ItemArray.Length; j++) 
    { 
    string val = dt.Rows[i].ItemArray[j].ToString(); 
    dt.Rows[i].ItemArray[j] = "My New Value"; 

    Debug.WriteLine("val: {0}, new: {1}", val, dt.Rows[i].ItemArray[j].ToString()); 
    } 
} 
+0

是的,你的代碼給了我目前得到的結果。 – chobo2 2012-02-09 22:36:07

0

嘗試只讀設置爲false [i] .ItemArray [j] .ReadOnly = false(對此不太確定)

0

這不會工作作爲要修改的數據的圖像

ds.Tables [0] .Rows [0] .ItemArray [1] =「新數據」

這將工作

ds.Tables [ 0] .Rows [0] .Item [1] =「新數據」;

確保你不使用itemarray,而是使用item。這是爲vb.net

相關問題