2016-10-19 8 views
1

Я написал следующий код для того, чтобы объединить значение столбца «lblJurisdiction» все те строки, где проверяются флажок (истина) в виде сеткиLinq код не работает должным образом

if (grdView.Rows.Count > 0) 
{ 
    foreach (GridViewRow row in grdView.Rows) 
    { 
     CheckBox chkbox = row.FindControl("chkbox") as CheckBox; 
     Label lblJurisdiction = row.FindControl("lblJurisdiction") as Label; 
     bool saveThis = chkbox.Checked; 
     if (saveThis == true) 
     { 
      List<String> Items = new List<String>(); 
      Items.Add(lblJurisdiction.Text); 
      Items.Sort(); 
      List<string> Unique = Items.Distinct().ToList(); 
      string ReplacedJurisdiction = string.Join(",", Unique.ToArray()); 
      hdnJurisdiction.Value = ReplacedJurisdiction; 
     } 
    } 
} 

Для например сетки вида содержит

  • [истинный] [Alabama] [некоторое значение]
  • [истинный] [Alaska] [некоторое значение]
  • [ложь] [Нью-Йорк] [некоторое значение]
  • [ложь] [California] [некоторое значение]

Теперь скрытое поле должно содержать штат Алабама, Аляска Это объединение только один, т.е. на Аляске ...

+1

Мы не психические. –

+0

Я только что задал этот вопрос, чтобы исправить проблему, связанную с девайсерами потока стека. – Nida

+3

Нет. Вы находитесь на бесплатном веб-сайте, предлагая людям отказаться от своего времени и помочь вам бесплатно. Здесь ** нет ** работы **. Немного смирения пройдут долгий путь. Как будет предоставлена ​​полная информация в вашем вопросе. –

ответ

3

Вы должны изменить область переменных! Вы должны объявить свой список за пределами цикла foreach и установить значение после выполнения расчета. Я также изменил ваш код, чтобы соответствовать общим соглашениям об именах и кодировках на C#.

if (grdView.Rows.Count > 0) 
{ 
    var states = new List<string>(); 
    foreach (GridViewRow row in grdView.Rows) 
    { 
     var chkbox = row.FindControl("chkbox") as CheckBox; 
     if (chkbox.Checked) 
     { 
      var lblJurisdiction = row.FindControl("lblJurisdiction") as Label; 
      states.Add(lblJurisdiction.Text); 
     } 
    } 
    hdnJurisdiction.Value = string.Join(", ", states.Distinct().OrderBy(x => x)); 
} 
+0

. Лучшим выбором было бы использовать LINQ, выбирать все тексты меток, а затем использовать Join. Это позволит избежать создания отдельного списка –

1

Вы должны конкатенации строк, теперь вы перезаписывают их в вашем скрытом поле

if(hdnJurisdiction.Value.Length > 0 && ReplacedJurisdiction != "") 
    hdnJurisdiction.Value += ", "; 

hdnJurisdiction.Value += ReplacedJurisdiction; 
0

Исходный код не использует LINQ вообще. Запрос LINQ, чтобы выбрать метки всех проверяемых строк может быть это:

var labels= grdView.Rows.OfType<GridViewRow>() 
       .Where(row=>(row.FindControl("chkbox") as CheckBox)?.Checked) 
       .Select(row=>(row.FindControl("lblJurisdiction") as Label)?.Text) 
       .Distinct() 
       .OrderBy(x=>x); 

или это, в форме запроса:

var labels=(from row in grdView.Rows.OfType<GridViewRow>() 
      let chkbox = row.FindControl("chkbox") as CheckBox 
      let label=row.FindControl("lblJurisdiction") as Label 
      where chkbox.Checked    
      select label.Text) 
      .Distinct().OrderBy(x=>x); 

После того как вы все ярлыки, вы можете присоединиться к ним:

var text=String.Join(labels); 
Смежные вопросы