2013-08-13 5 views
0

Можно сделать следующее:Datatable обновления без использования DataRow петли

У меня есть следующие DataTable

================================= 
ID  || Width || Value || 
================================= 
size-1 || 50  ||   || 
name-1 || 100 ||   || 
zip-1 || 50  ||   || 
size-2 || 50  ||   || 
name-2 || 100 ||   || 
zip-2 || 50  ||   || 
================================= 

Я хочу, чтобы иметь возможность петлю через DataTable и обновлять колонку значения, с значение textcontrolbox.text

Session[sectionName] = test; 
DataTable dt = (DataTable)Session[sectionName]; 

     var strIDS = from p in dt.AsEnumerable() 
        select new 
        { 
         ID = p.Field<string>("ID") 
        }; 

     foreach (var strID in strIDS) 
     { 
      TextBox tempBox = DynamicControlsHolder1.FindControl(strID.ID) as TextBox; 
      string val = tempBox.Text; 

      // This is where i want to be able to update the value column, but i can't figure out how to 
      // Can someone please help 

     } 

ответ

3

весь код может быть заменен:

foreach (DataRow Row in dt.Rows) 
    Row["Value"] = (DynamicControlsHolder1.FindControl(Row["ID"]) as TextBox).Text; 
+0

+1 для простого использования традиционного 'foreach', на самом деле я предпочитаю этот стиль больше, чем' LINQ', 'LINQ' просто для запроса OP. «LINQ» не всегда лучший, но многие люди всегда стараются использовать его как можно больше. –

+0

wow, мне нравится, что это похоже, кажется, намного чище, но когда я попробовал это сейчас, он говорит, что findcontrol имеет некоторые недопустимые аргументы, и мне пришлось добавить следующее: foreach (DataRow Row в dt.rows) – user2593590

+0

it работал, я просто должен был добавить для него следующее: foreach (DataRow Row в dt.Rows) { Строка ["Value"] = (DynamicControlsHolder1.FindControl ((строка) Строка ["ID"]) как TextBox).Текст; } – user2593590

3
int i = 0; 
foreach (var strID in strIDS) 
    { 
     TextBox tempBox = DynamicControlsHolder1.FindControl(strID.ID) as TextBox; 
     dt.Rows[i++]["Value"] = tempBox.Text; 
    } 

Я думаю, вы должны попробовать обновить прямо в LINQ, как это:

var totalRows = dt.AsEnumerable()     
        .Select(p=>      
        { 
        p["Value"] = (DynamicControlsHolder1.FindControl(p.Field<string>("ID")) as TextBox) ?? ""; 
        return p; 
        }).Count(); 

Для обновления определенной строки, вы можете попробовать это:

var row = dt.AsEnumerable() 
      .Where(p=>p.Field<string>("ID") == "ID you want").FirstOrDefault(); 
if(row != null) row["Value"] = (DynamicControlsHolder1.FindControl(row["ID"].ToString()) as TextBox).Text; 
+0

-1. Нет никакой гарантии, что строки в порядке. Ему нужно найти строки по ID. – dotNET

+0

@dotNET почему бы и нет? См. Его запрос, чтобы удалить нижний предел. –

+0

AH, я вижу это сейчас. Извините за недопонимание. – dotNET

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