В чем разница между элементами CheckBoxList и TableRows при динамическом отображении в ASP.Net?

Я работаю над небольшим изменением функциональности страницы на веб-сайте ASP.Net. На исходной странице был список флажков, написанный на странице без жестко запрограммированных элементов.

Вместо этого при начальном рендеринге cbl привязывается к результатам запроса следующим образом:

sSQL = "select query here";

using (SqlConnection dbcon = new DataAccess().OpenDb())
{
     using (SqlDataReader dr = new SqlCommand(sSQL, dbcon).ExecuteReader())
     {
          cbl.DataTextField = "description";
          cbl.DataValueField = "productid";
          cbl.DataSource = dr;
          cbl.DataBind();
     }
     dbcon.Close();
}

При постбэке следующий код:

foreach (ListItem li in cbl.Items) { if (li.Selected) rtnQS += li.Value + ","; }

С удовольствием просматривает элементы динамического списка с привязкой к данным в списке флажков и извлекает проверенные значения. Я попытался сделать то же самое, поместив на страницу пустую таблицу, а затем динамически создав строки:

sSQL = "similar select query here";

using (SqlConnection dbcon = new DataAccess().OpenDb())
{
    using (SqlDataReader dr = new SqlCommand(sSQL, dbcon).ExecuteReader())
    {
       while (dr.Read())
       {
           TableRow tr = new TableRow();

           TableCell tc = new TableCell();

           CheckBox chk = new CheckBox();

           chk.Text = dr["description"].ToString();
           chk.InputAttributes.Add("id", dr["id"].ToString());
           chk.Checked = true;

           tc.Controls.Add(chk);

           TableCell tc2 = new TableCell();

           if (Convert.ToBoolean(dr["controlcondition"]))
           {
                CheckBoxList cbl_sub = new CheckBoxList();
                cbl_sub.Attributes.Add("for", dr["id"].ToString());
                sSQL = "subquery";
                using (SqlConnection newcon = new DataAccess().OpenDb())
                {
                   using (SqlDataReader br = new SqlCommand(sSQL, newcon).ExecuteReader())
                   {
                       cbl_block.DataTextField = "subname";
                       cbl_block.DataValueField = "subid";
                       cbl_block.DataSource = br;
                       cbl_block.DataBind();
                   }
                }

                tc2.Controls.Add(cbl_sub);
           }
           else
           {
              TextBox txtSub = new TextBox();
              txtSub.Attributes.Add("for", dr["id"].ToString());

              tc2.Controls.Add(txtSub);
           }

           tr.Cells.Add(tc);
           tr.Cells.Add(tc2);

           tblDispatchOpt.Rows.Add(tr);
        }
    }

    dbcon.Close();
}

Единственная проблема заключается в том, что когда итератор приходит к таблице, он читает только жестко закодированную строку заголовка. (Таблица прекрасно отображается со всеми правильными атрибутами на исходной странице.)

Вот фрагмент кода, который пытается прочитать строки таблицы:

foreach (TableRow row in tblDispatchOpt.Rows)
{
      TableCell cell = row.Cells[0];

      ++counter;

      foreach (Control c in cell.Controls)
      {
           if (c is CheckBox)
           {
               CheckBox cb = (CheckBox)c;
               if (cb.Checked && cb.Attributes["ttid"] != null) dtTTInfo.Rows.Add(cb.Attributes["ttid"].ToString(), "", "");
           }
      }
}

За исключением того, что проверка метки отладки с радостью сообщает мне, что есть только одна строка, и это жестко закодированная строка заголовка. Поэтому, по сути, не читает другие строки, поскольку кажется, что страница не верит, что они существуют, когда дело доходит до их чтения.

Так почему это не работает с таблицей? Или, если это не работает с таблицей по обычной причине, что вещи не работают с динамическими элементами управления для обратных передач, например. рендеринг, жизненный цикл и т. д., почему это работает со списком флажков?


person One Monkey    schedule 06.04.2011    source источник
comment
Выложите код, который не работает. Показ кода, который работает, не поможет нам узнать, в чем проблема.   -  person Hogan    schedule 06.04.2011


Ответы (1)


Вы должны воссоздавать динамические элементы управления для каждой обратной передачи, если хотите получать от них значения. Вы должны сделать это в методе CreateChildControls().

person Marek Kwiendacz    schedule 06.04.2011
comment
Круто, немного помогает. Тем не менее, я специально спросил, почему первоначальный кодер не должен был делать это со списком флажков? Если бы я знал это, я уверен, что это очень помогло бы. Я изменяю чужой код, и все их вещи все еще работают, это модификация, которая не работает. - person One Monkey; 06.04.2011
comment
При дальнейшем рассмотрении очень важно знать, почему он будет работать со списком флажков, потому что для реализации метода CreateChildControls мне придется изменить текущую функциональность в дополнение к новой. Я не хочу ничего ломать, если я не могу объяснить, почему я должен был это сделать. - person One Monkey; 06.04.2011
comment
CheckboxList был помещен туда как статический элемент управления, но заполнялся динамически, верно? - person Marek Kwiendacz; 06.04.2011
comment
да. Таблица тоже только строки динамические. - person One Monkey; 06.04.2011
comment
Итак, опять же - проблема с пересозданием контролов: checkboxlist - это один контрол и он создается всегда, поэтому после постбэка вы получаете любую информацию об изменениях в нем. Таблица для постбэка существует, но она слишком большая, и вам нужно сначала воссоздать ее содержимое в своем коде. Чтобы получить информацию из динамического управления, вы должны всегда воссоздавать ее. - person Marek Kwiendacz; 06.04.2011
comment
Хорошо, но разве каждый ListItem в списке CBL не является отдельным элементом управления сам по себе? Я до сих пор не понимаю, как он может видеть динамически созданные элементы списка в статическом, но пустом CBL, но не видеть динамически созданные строки в статическом, но пустом элементе управления таблицей. Не бери в голову. - person One Monkey; 06.04.2011
comment
checkboxlist воссоздает элементы внутри, как и каждый элемент управления с привязкой к данным, но если вы используете таблицу, вам нужно реализовать свою собственную функциональность, потому что это не элемент управления с привязкой к данным; - person Marek Kwiendacz; 06.04.2011
comment
Ааааа. Я понимаю. Верно. Ну, раздражает, но, по крайней мере, понятно. Спасибо. - person One Monkey; 06.04.2011