Свойство «флажок» ASP всегда возвращает false - PullRequest
1 голос
/ 14 февраля 2012

Недавно я переместил элемент управления «DataList» в UserControl и сослался на него на своей странице ASPX.DataList содержит флажки с отмеченными свойствами, изначально назначенными источником данных.

<asp:DataList ID="dlspec" CssClass="specs" runat="server" GridLines="Vertical" OnItemDataBound="dlspec_ItemDataBound">
    <FooterStyle BackColor="#CCCCCC" />
    <AlternatingItemStyle CssClass="alt-grey" />
    <SelectedItemStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
    <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" />
      <ItemTemplate>
          <table>
            <tr>
              <td class="leftcol">
                 <asp:Label ID="lblDimension" runat="server" Text='<%# Eval("Dimension") %>'></asp:Label>:
               </td>
               <td class="ProductDetailData">
                    <asp:Label ID="lblName" runat="server" Text='<%# Eval("Attribute") %>'></asp:Label>
               </td>
               <td class="find-similar">
                 <asp:CheckBox ID="FindSimilarCheckbox" runat="server" Checked='<%# Eval("CheckBox")=="true"? true:false %>' Text='<%# Eval("AttributeID") %>' Visible='<%# Eval("CheckBoxState")=="0"? true:false %>' />
                </td>
              </tr>
            </table>
         </ItemTemplate>
       </asp:DataList>

Теперь, при событии нажатия кнопки в «aspx», к которому привязан пользовательский элемент управления, я пытаюсь получить «проверил "свойства флажков, чтобы пройти через некоторую логику.Я в основном использую ниже, чтобы найти usercontrol и перебрать элементы управления в нем.

Control SpecsPanel = FindSimilarPnl.FindControl("Specifications").FindControl("dlspec");
foreach (Control ct in SpecsPanel.Controls)
        GetCheckedAttributes(ct, ref qry);

Однако свойство checked для флажков всегда оказывается «false» после того, как я переместил список данных впользовательский элемент управления. Любые идеи почему? Я что-то упустил глупо? Очень признателен за любые мысли идеи. Дайте мне знать, если мне нужно добавить больше кода для вас, чтобы лучше понять. Спасибо

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Я узнал, почему это происходит ... собираюсь ответить на мой собственный вопрос.Таким образом, идентификатор CheckBox в шаблоне - «FindS SimilarCheckBox», и он переименовывается во время привязки данных.поэтому, когда происходит обратная передача, сервер возвращает идентификаторы для всех флажков как «FindS SimilarCheckBox», а свойство Checked для всего ложно.Мне пришлось повторно связать данные usercontrol и на этот раз поставить условие, чтобы проверить, является ли это операция обратной передачи и существует ли уникальный идентификатор Check Box в коллекции Request.Form, чтобы установить свойство Checked в chkbox.Примерно так:

protected void dlspec_ItemDataBound(object sender, DataListItemEventArgs e)
 {
    var ck = e.Item.FindControl("FindSimilarCheckbox") as CheckBox;
            if (ck != null)
            {
                ck.ID = ck.Text;
                ck.Text = "";
                //EDIT: Karthik - Since we moved the Specifications in to user control, check if this a postback , then check to see the CheckBox state on the form while posting back
                if(IsPostBack && Request.Form[ck.UniqueID] != null)
                {
                    ck.Checked = true;
                }
 }

Моя проблема решена.Надеюсь, что этот ответ поможет вам понять, что вызвало мою проблему.Дайте мне знать, если мне нужно дать более подробную информацию.

2 голосов
/ 14 февраля 2012

Вот метод, который вы можете создать.

public void FindAllCheckedBoxes(Control ctrl) 
{ 
    if (ctrl != null) 
    { 
        foreach (Control c in ctrl.Controls) 
        { 
            if (c is CheckBox)
            {   
               ((CheckBox)c).Checked = false;
               //or mess around with the code to do what ever it is you want.. 
            } 
           //uncomment if you need to add recurisve call FindAllCheckedBoxes(c); 
        } 
    } 
} 

использование: FindAllCheckedBoxes (FindS SimilarCheckbox);

если вам нужно сделать это на веб-странице, вы можете использовать следующий кода также внесите необходимые изменения, чтобы соответствовать вашему UseCase

Protected void SetCheckBoxState( ControlCollection  controls)
{
    Foreach (Control c in controls)
    {
        If (c is System.Web.UI.WebControls.CheckBox)//change to make it CheckBox
        {
            CheckBox cb = c as CheckBox;
            cb.Checked = false; // or true what ever you need to do 
        }
        Else if (c.controls.Count > 0)
        {
            SetCheckBoxState(c.Controls)
        }
    }
}
...