Почему значение не обновляется в моей строке данных? - PullRequest
1 голос
/ 10 февраля 2012

У меня есть этот код

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 , он создает таблицу данных и ее строки. Не уверен, что он делает что-то напуганное, что мешает мне делать то, что я хочу.

Ответы [ 5 ]

6 голосов
/ 10 февраля 2012

Вместо 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());
  }
}
1 голос
/ 10 февраля 2012

Это недостаток цикла foreach: вы не можете изменять содержимое коллекции, потому что оно доступно только внутри цикла. Возможно, вам придется использовать обычный цикл for. Согласно этому документу Microsoft" оператор foreach используется для итерации по коллекции, чтобы получить требуемую информацию, но не должен использоваться для изменения содержимого коллекции, чтобы избежать непредсказуемых побочных эффектов ».

0 голосов
/ 09 марта 2016

Это не будет работать, так как вы изменяете изображение данных

ds.Tables [0] .Rows [0] .ItemArray [1] = «Новые данные»

Это будет работать

ds.Tables [0] .Rows [0] .Item [1] = «Новые данные»;

Убедитесь, что вы не используете itemarray, вместо этого используйте item. Это для vb.net

0 голосов
/ 10 февраля 2012

попробуйте установить readonly в false перед внесением каких-либо изменений

dt.Rows [i] .ReadOnly = false

или только ячейка

dt.Rows [i] .ItemArray [j] .ReadOnly = false (не уверен в этом)

0 голосов
/ 10 февраля 2012

получите ли вы тот же результат, если используете

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());
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...