Как перебрать два вида сетки, чтобы найти одинаковые значения? C#

#c# #asp.net #gridview #visual-studio-2015

#c# #asp.net #gridview #visual-studio-2015

Вопрос:

У меня на моей странице есть два вида сетки — grvBookCategories показывает категории одной конкретной книги и grvCategories содержит все возможные категории для библиотеки. grvBookCategories отображается при загрузке страницы и grvCategories запускается при нажатии кнопки. cbxGrvCategories В ItemTemplate of есть флажок grvCategories .

Вопрос в том, как перебрать эти два вида сетки, чтобы найти одинаковые значения в обоих из них (оба содержат столбец с именем категории)? Если есть совпадение — соответствующий флажок должен быть установлен. Например, если в них 3 строки, grvBookCategories то также должны быть установлены 3 флажка grvCategories .

Я пытался сделать это, используя циклы событий grvCategories_RowDataBound и foreach, но результаты не совсем правильные. Проблема в том, что в последней grvCategories строке есть совпадение. В таком случае флажок в этой строке никогда не установлен, для всех остальных строк результаты в порядке.

 protected void grvCategories_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    string rowcValue = "";
    string rowbcValue = "";
    CheckBox cbx = new CheckBox();
    foreach (GridViewRow rowc in grvCategories.Rows)
    {
      if (rowc.RowType == DataControlRowType.DataRow)
      {
        rowcValue = rowc.Cells[2].Text;
        cbx = (CheckBox)rowc.Cells[3].FindControl("cbxGrvCategories");
        foreach (GridViewRow rowbc in grvBookCategories.Rows)
        {
          if (rowbc.RowType == DataControlRowType.DataRow)
          {
            rowbcValue = rowbc.Cells[1].Text;
            if (rowcValue.Equals(rowbcValue))
            {
              cbx.Checked = true;
              break;
            }
            else
            {
              cbx.Checked = false;
            }
          }
        }
      }
    }
  }
}
 

Заранее спасибо за любую помощь!

Комментарии:

1. foreach (GridViewRow row1 в G1.Rows) { if (row1. RowType == DataControlRowType.DataRow) { строка gv1Value = row1.Cells[0].Text; //итерация второго gridview foreach (GridViewRow row2 в G2.Rows) { if (row2.RowType == DataControlRowType.DataRow) { строка gv2Value = row2.Cells[0].Text; //сделайте сравнение здесь, если (gv1Value. Равно(gv2Value)) { }}}}}

2. Поиск полей в таком представлении сетки будет работать только со BoundField столбцами. Не TemplateField и AutoGenerated столбцы. Лучше выполнить поиск по исходным данным.

3. @viveknuna К сожалению, у меня это все еще не работает

4. @VDWWD Данные из базы данных находятся в BoundField, кнопки помещаются в TemplateField, значение AutoGenerateColumns равно false. Так разве это нельзя как-то сделать?

5. Если это boundfields, то это можно сделать. Похоже, вы на правильном пути с введенным кодом grvCategories_RowDataBound . Что именно представляют собой эти «совершенно неправильные результаты»? Что это такое и что ожидается? И вы связывали данные grvCategories раньше grvBookCategories ? В противном случае поиск всегда будет ложным.