C# 为什么我的datatable行中的值没有得到更新?

C# 为什么我的datatable行中的值没有得到更新?,c#,datatable,C#,Datatable,我有这个密码 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},

我有这个密码

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());
  }
}
编辑

再试试

  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
再来一次

 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());
                }
            }
for(int i=0;i
给我

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: 
用户代码未处理System.Data.ReadOnlyException 消息=列“日期”为只读。 Source=System.Data 堆栈跟踪: 在System.Data.DataRow.set_项(DataColumn列,对象值) 在System.Data.DataRow.set_项(Int32 columnIndex,对象值) 位于中的CCRecommendator.Framework.Services.CreditCardRecommendatorService.ParseTransactions(Stream) 在中的CCRecommendAtor.WebUI.Controllers.RecommendController.UploadTransactions(HttpPostedFileBase文件)处 在lambda_方法中(闭包、控制器基、对象[]) 位于System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller,Object[]参数) 位于System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext ControllerContext,IDictionary`2参数) 位于System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor,IDictionary`2参数) 在System.Web.Mvc.ControllerActionInvoker.c_uuDisplayClass15.b_uuu12()中 位于System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter筛选器、ActionExecutingContext预文本、Func`1 continuation) 内部异常:
那么可能这些东西是只读的还是什么


我正在使用它来创建数据表及其行。不确定它是否正在做一些让我无法做我想做的事情。

这是foreach循环的缺点,您不能修改集合的内容,因为它的范围仅限于循环内部。您可能需要使用常规for循环。根据这一点,“foreach语句用于遍历集合以获得所需信息,但不应用于更改集合的内容以避免不可预测的副作用。”

不使用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());
  }
}
foreach(数据行中的数据行)
{
Debug.WriteLine(“行的开始”);
for(int i=0;i
如果使用

Debug.WriteLine(“val:+val+”,new:+row.ItemArray[i].ToString())

试试这个

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());
  }
}
for(i=0;i
在进行任何更改之前,请尝试将readonly设置为false

dt.Rows[i].ReadOnly=false

或仅细胞


dt.Rows[i].ItemArray[j].ReadOnly=false(对此不确定)

当您修改数据的映像时,这将不起作用

ds.Tables[0]。行[0]。ItemArray[1]=“新数据”

这会奏效的

ds.表[0]。行[0]。项[1]=“新数据”


确保不使用itemarray,而是使用item。这适用于vb.net

hmmm,即使它内部有一个for循环,可以通过另一个集合。当您试图更改foreach循环中的值时,它通常会发出抱怨是的,将upper foreach更改为regular for循环并重试。不,这不是我的问题。其他正在发生的事情正在阻止它。感谢您发布此消息。我从来没见过ItemArray。将要发布,嗯,这个。:)@这在我的测试中起了作用。鉴于您的错误,您的“列”设置为
ReadOnly=True
。所以你需要关闭它,或者显然不要尝试更改只读列。是的,我就是这么做的。这似乎是双重问题,“row.ItemArray.SetValue”似乎不适用于foreach。然后是只读问题(有点奇怪,第[i]行给了我一个错误来告诉我发生了什么)。是的,你的代码给了我和我现在得到的一样的结果。
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());
  }
}