2015-08-04 3 views
0

У меня есть DataTable, из которого я хотел бы перебирать каждую строку и столбец, а затем выбирать значение из определенного столбца в зависимости от других значений в столбцах/каждой строке.Пройти через DataTable и выбрать только определенные значения в столбце

Мой код в настоящее время выглядит следующим образом:

foreach (DataRow drow in dt.Rows) 
{ 
    foreach (DataColumn dcol in dt.Columns) 
    { 
     foreach (var Item in ImportData) 
     { 
      if (Item.Value.Equals(true)) 
      { 
       if (Item.Key.Equals("" + dcol)) 
       { 
        string value = drow[dcol].ToString(); 
        if (value.Equals("X")) 
        { 
         outDraws += drow["Drawing"].ToString(); 
         outDraws += "\n"; 
        } 
       } 
      } 
     } 
    } 
} 

ImportData является Dictionary<string, bool>, который содержит данные, которые я хочу, чтобы сравнить с моим DataTable.

string outDraws - это просто строка, которая должна содержать содержимое чертежей, которые я хочу распечатать.

Моя проблема в том, что я хочу распечатать содержимое в столбце «Рисование» строки, где все столбцы с тем же именем, что и ключи в ImportData, имеют значение «Х» в качестве значения. На данный момент я получаю все строки, где любой из столбцов имеет значение «Х» как значение и имеет то же имя, что и любой ключ в ImportData.

Я понимаю, что вам будет очень сложно получить то, что я хочу сделать, но, пожалуйста, спросите, нужна ли вам дополнительная информация, и я постараюсь предоставить.

Большое спасибо заранее.

Edit:

ImportData содержит название различных продуктов в качестве ключей. Эти продукты либо были выбраны, либо нет клиентом через другую программу, если они были выбраны, они имеют значение true, и если они не выбраны, они имеют значение false.

С помощью метода, представленного выше, я хотел бы сравнить ВСЕ ключи, которые имеют значение true с именами столбцов в DataTable. Если имя столбца соответствует ключу в ImportData (который является именем продукта), то я хочу проверить, имеет ли этот столбец в определенной строке значение «X».

Это продолжается для ВСЕХ ключей в ImportData, и в конце я должен знать, какая строка в DataTable имеет «X» во всех столбцах с тем же именем, что и ключи в ImportData. Для этой строки я хотел бы получить содержимое столбца «Рисование». Так для примера сказать, что ImportData содержит:

[Мотор, правда] [Product6, правда] [Product7, правда]

Тогда я хотел бы, чтобы распечатать чертеж колонки в строке 6.

К сожалению, я не могу размещать фотографии ..

+0

Затем проверьте только колонку чертежа, а не все столбцы? – BugFinder

+0

Я хотел бы проверить все столбцы и только там, где есть «X» для всех столбцов с тем же именем, что и ВСЕ ключи в ImportData. Я хотел бы распечатать столбец чертежа – Oliver

+0

Пожалуйста, объясните более подробно, что содержит ImportData, что находится в таблице данных и чего вы хотите достичь. Возможно, добавьте простой, но полный образец, который компилируется как консольное приложение. – jeroenh

ответ

0

Как с любой проблемой: разделяй и властвуй. Разбейте свою проблему на мелкие кусочки и идите оттуда.

Из того, что я понимаю, вы хотите что-то сделать с определенными рядами из datatable.Что-то вроде:

foreach (var drow in dt.Rows.OfType<DataRow>()) 
{ 
    if (SomeConditionIsMet(dt, drow, ImportData)) 
    { 
     outDraws += drow["Drawing"].ToString(); 
     outDraws += "\n"; 
    } 
} 

Функция SomeConditionIsMetcould выглядит следующим образом:

private static bool SomeConditionIsMet(
         DataTable dt, DataRow drow, 
         IDictionary<string, bool> importData) 
{ 
    // TODO if the condition is met, return true 
    // otherwise, return false 
} 

Теперь ваша задача упрощается думать о том, что это означает, что 'Некоторые условие выполнено. После того, как вы можете четко выразить, что в словах, переименовать функцию, чтобы отразить это (например, «AllColumnsAreChecked»)

Вот пример с решением, как я понимаю:

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     var importData = new Dictionary<string, bool>() 
     { 
      {"Product1", true}, 
      {"Product2", false}, 
      {"Product3", true}, 
     }; 

     var dt = new DataTable(); 
     dt.Columns.Add("Product1"); 
     dt.Columns.Add("Product2"); 
     dt.Columns.Add("Product3"); 
     dt.Columns.Add("Product4"); 
     dt.Columns.Add("Drawing"); 

     // row1 should be added 
     var row1 = dt.NewRow(); 
     row1["Product1"] = "X"; 
     row1["Product3"] = "X"; 
     row1["Drawing"] = "Drawing1"; 
     dt.Rows.Add(row1); 

     // row2 should not be added 
     var row2 = dt.NewRow(); 
     row2["Product1"] = "X"; 
     row2["Drawing"] = "Drawing2"; 
     dt.Rows.Add(row2); 

     string outDraws = string.Empty; 

     foreach (DataRow drow in dt.Rows.OfType<DataRow>()) 
     { 
      if (AllColumnsAreChecked(drow, importData)) 
      { 
       outDraws += drow["Drawing"].ToString(); 
       outDraws += "\n"; 
      } 
     } 

     Console.WriteLine(outDraws); 
    } 

    private static bool AllColumnsAreChecked(DataRow drow, Dictionary<string, bool> importData) 
    { 
     foreach (var key in importData.Keys) 
     { 
      if (!importData[key]) 
       continue; 
      var value = drow[key] as string; 
      if (value != "X") 
       return false; 
     } 
    } 
} 

Bonus: вот реализация на основе LINQ проверки:

private static bool AllColumnsAreChecked(DataRow drow, Dictionary<string, bool> importData) 
    { 
     return importData.Keys 
      .Where(k => importData.ContainsKey(k) && importData[k]) // the field must be enabled in importData 
      .All(k => (drow[k] as string) == "X"); // the corresponding value in the row must be 'X' 
    } 
+0

Да, может быть, это хорошая идея, я попробую. Как уже упоминалось выше, я понял, когда писал, что мне будет сложно описать, что именно я хочу сделать. Надеюсь, я смогу придумать решение. – Oliver

+0

Сначала подумайте о проблеме *, а затем о решении. Если вы можете четко описать проблему, решение представится естественным образом. – jeroenh

+0

«Моя проблема в том, что я хочу распечатать содержимое в столбце« Рисование »строки, где все столбцы с тем же именем, что и« Ключи в ImportData »имеют значение« Х »как значение». Это моя проблема. – Oliver

0

Попробуйте

DataTable tbl = new DataTable(); 
foreach (DataRow row in tbl.Rows) 
{ 
    object cellData = row["colName"]; 
} 
Смежные вопросы