2012-04-06 7 views
3

У меня есть страница, на которой пользователи могут выбирать файлы разных документов в элементе управления datalist. Документы классифицируются по категориям с использованием обработчика события предварительной обработки. Документы выбираются на основе элементов управления Checkbox (а не Checkboxlist). Все идет нормально. Далее я хочу поставить флажок «Выбрать все» рядом с именем каждой категории, в котором должны быть выбраны только флажки под этой категорией. Вот контроль DataList:asp.net datalist выбрать все флажки для каждой категории

<asp:DataList ID="DataList1" runat="server" RepeatDirection="Vertical" OnPreRender="DataList1_PreRender" DataKeyField="docid" EnableViewState="false"> 
<ItemTemplate> 
    <table cellpadding="0" cellspacing="0" id="tbl_data"> 
     <tr> 
      <td> 
       <asp:Label ID="lblHeader" runat="server" Font-Bold="True" Font-Underline="True"></asp:Label> 
      <asp:Label runat="server" id="lbl_cb_all" visible="false">Select All <input runat="server" id="cb_selectall" type="checkbox" value='<%# Eval("catid") %>' /> </asp:Label> 
      </td> 
     </tr> 

     <tr runat="server" id="tr_data"> 
      <td> 
       <asp:Label ID="lbl_categoryname" runat="server" Text='<%# Eval("categoryname") %>' Visible="false" /> <!-- Hide this; only used in Code Behind --> 
       <input runat="server" id="cb_docid" type="checkbox" value='<%# Eval("docid") %>' /> 
        <asp:Hyperlink ID="hpl_docfileencr" Text='<%# Eval("docfileencr") %>' NavigateUrl='<%# "~/PDFEncr/" + DataBinder.Eval(Container.DataItem, "docfileencr") %>' Target="_blank" runat="server" /> 
       <br /> 
      </td> 
     </tr> 
    </table> 
</ItemTemplate> 

и вот код OnPreRender:

protected void DataList1_PreRender(object sender, EventArgs e) 
{ 
    string strTempLabelCategory = ""; 
    foreach (DataListItem item in DataList1.Items) 
    { 



     Label lbl_categoryname = item.FindControl("lbl_categoryname") as Label; 


     if (strTempLabelCategory.ToUpper() != lbl_categoryname.Text.ToString().ToUpper()) 
     { 
      strTempLabelCategory = lbl_categoryname.Text.ToString().ToUpper(); 
      Label lblHeader = item.FindControl("lblHeader") as Label; 
      lblHeader.Text = strTempLabelCategory.ToUpper(); 

      Label lbltempdiv = item.FindControl("lbl_cb_all") as Label; 
      lbltempdiv.Visible = true; 
     } 
    } 
} 

Я посмотрел на то, что может работать в моем коде, но не повезло. И я слишком вложен в этот код, чтобы попробовать обработчик Checkboxlist (не уверен, что это все равно поможет). Любые идеи? Я думал, что могу использовать: http://www.dotnetcurry.com/ShowArticle.aspx?ID=77 код, но не знаю, как я могу это сделать? Если я смогу каким-то образом сделать привязку галочки к тегу, а затем искать все теги, то может быть, код ссылки поможет. Спасибо!

+0

использовать jquery, чтобы установить флажки для элементов, являющихся дочерними элементами элемента datalist. когда флажок select all проверен, он запускает jquery, чтобы получить элемент datalist по идентификатору, а затем цикл через дочерние элементы, которые являются входами типа флажка, и переключает их. – Brian

+0

Брайан, спасибо. Но моя проблема состоит в том, чтобы выяснить элемент «datalist по id, а затем цикл через дочерние элементы» ... – IrfanClemson

+0

Я попытался, чтобы каждый ItemTemplate содержал таблицу с идентификатором tbl_data, а затем нашел родительскую таблицу tbl_data для сверления в флажках внутри tr_data для поиска флажков, но таблицы tbl_data - рендеринг для каждого элемента. – IrfanClemson

ответ

3
  1. Используйте HiddenFields для хранения CatID и DocID
  2. Используйте ASP.NET CheckBoxes вместо HTML-входы для обоего
  3. Ручки чеки-All CheckBox»CheckedChanged события:

protected void CheckAllChanged(Object sender, EventArgs e) 
{ 
    CheckBox checkAll = (CheckBox)sender; 
    DataListItem item = (DataListItem)checkAll.NamingContainer; 
    HiddenField HiddenCatID = (HiddenField)item.FindControl("HiddenCatID"); 
    var catCheckBoxes = DataList1.Items.Cast<DataListItem>() 
     .Where(li => ((HiddenField)li.FindControl("HiddenCatID")).Value == HiddenCatID.Value) 
     .Select(li => li.FindControl("cb_docid")); 
    foreach (CheckBox docCheckBox in catCheckBoxes) 
    { 
     docCheckBox.Checked = checkAll.Checked; 
    } 
} 

на aspx:

<asp:CheckBox runat="server" OnCheckedChanged="CheckAllChanged" AutoPostBack="true" id="cb_selectall" /> 
<asp:HiddenField ID="HiddenCatID" runat="server" Value='<%# Eval("CatID") %>' /> 
<asp:HiddenField ID="HiddenDocID" runat="server" Value='<%# Eval("DocID") %>' /> 

Вам необходимо также указать EnableViewState=true в DataList, чтобы поддерживать состояние флажка и активировать проверку/снятие отметки.


Edit:

Потому что у вас есть проблемы, чтобы он работает, вот полная страница рабочего образца.

Вот необходимые элементы управления на ASPX (заметьте Fe <tr runat="server" id="tr_category">):

<ItemTemplate> 
    <table cellpadding="0" cellspacing="0" id="tbl_data"> 
     <tr runat="server" id="tr_category"> 
      <td> 
       <asp:Label ID="lblHeader" runat="server" Font-Bold="True" Text='<%# Eval("categoryname") %>' Font-Underline="True"></asp:Label> 
       <asp:Label runat="server" ID="lbl_cb_all">Select All 
       <asp:CheckBox runat="server" OnCheckedChanged="CheckAllChanged" AutoPostBack="true" id="cb_selectall" /> 
       </asp:Label> 
      </td> 
     </tr> 
     <tr runat="server" id="tr_data"> 
      <td> 
       <asp:HiddenField ID="HiddenCatID" runat="server" Value='<%# Eval("CatID") %>' /> 
       <asp:CheckBox runat="server" id="cb_docid" /> 
       <asp:HyperLink ID="hpl_docfileencr" Text='<%# Eval("docfileencr") %>' NavigateUrl='<%# "~/PDFEncr/" + DataBinder.Eval(Container.DataItem, "docfileencr") %>' 
        Target="_blank" runat="server" /> 
       <br /> 
      </td> 
     </tr> 
    </table> 
</ItemTemplate> 
  1. Убедитесь, что DataList является привязки данных только if(!IsPostback), в противном случае выбор флажок не будет поддерживаться:

    protected void Page_Load(object sender, EventArgs e) 
    { 
        if (!IsPostBack) BindDataList(); 
    } 
    
  2. Я использую ItemDataBound вместо PreRender, что важно для ViewState, чтобы быть rel правильно омывается. Я также упрощены все:

    protected void DataList1_ItemDataBound(Object sender, DataListItemEventArgs e) 
    { 
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType==ListItemType.AlternatingItem) 
        { 
         var row = (DataRowView)e.Item.DataItem; 
         var view = row.DataView; 
         var lastRow = e.Item.ItemIndex == 0 ? null : view[e.Item.ItemIndex-1]; 
         var tr_category = (System.Web.UI.HtmlControls.HtmlTableRow)e.Item.FindControl("tr_category"); 
         var sameCategory = lastRow != null && (int)row["catid"] == (int)lastRow["catid"]; 
         tr_category.Visible = !sameCategory; 
        } 
    } 
    
  3. CheckAllChanged остается неизменной.

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

+0

Tim: Ваша кодировка работает. Я опубликую обновление позже. Еще нужно выяснить «снимите флажок», чтобы удалить все флажки, а также обработать базу данных, чтобы использовать флажок asp: теперь вместо флажка html. Большое спасибо! – IrfanClemson

+0

Что вы подразумеваете под 'uncheck'? Устранение флажков doc-check для каждой категории работает уже так же, как вы их проверяете, просто сняв флажок категории. –

+0

Если я снижу отметку cb_selectall, это не приведет к тому, что флажки соответствующей категории не будут отмечены. – IrfanClemson

0

Я думаю, что я получил это, чтобы работать с небольшой модификацией кода Тима. Несколько моментов: мне пришлось отключить ViewState для datalist, потому что в противном случае триггер check-all не проверял флажки. Я не понимаю, почему. Кроме того, проверка ispostback в событии page_load отсутствует, а привязка datalist привязывается к каждой загрузке. Я не такой «оптимальный» или нет. Я также сделал два набора Asp: RadioButtons: CheckAll и CheckNone вместо флажков. В любом случае, вот соответствующий код:

<asp:DataList ID="DataList1" runat="server" RepeatDirection="Vertical" DataKeyField="docid" 
       EnableViewState="false" OnItemDataBound="DataList1_ItemDataBound"> 
       <ItemTemplate> 
        <table cellpadding="0" cellspacing="0" id="tbl_data"> 
         <tr runat="server" id="tr_category"> 
          <td> 
           <asp:Label ID="lblHeader" runat="server" Font-Bold="True" Text='<%# Eval("categoryname") %>' 
            Font-Underline="True"></asp:Label> 
           <asp:Label runat="server" ID="lbl_cb_all">Select: All 
            <asp:RadioButton runat="server" OnCheckedChanged="CheckAllChanged" AutoPostBack="true" 
             ID="rb_selectall" GroupName="selectallnone" /> 
            | None 
            <asp:RadioButton runat="server" OnCheckedChanged="CheckAllChangedNone" AutoPostBack="true" 
             ID="rb_selectnone" GroupName="selectallnone" /> 
            <asp:HiddenField ID="HiddenCatID" runat="server" Value='<%# Eval("CatID") %>' /> 
            <asp:HiddenField ID="HiddenDocID" runat="server" Value='<%# Eval("docid") %>' /> 
           </asp:Label> 
          </td> 
         </tr> 
         <tr runat="server" id="tr_data"> 
          <td> 
           <asp:CheckBox runat="server" ID="cb_docid" Value='<%# Eval("docid") %>' /> 
           <asp:HyperLink ID="hpl_docfileencr" Text='<%# Eval("docfileencr") %>' NavigateUrl='<%# "~/PDFEncr/" + DataBinder.Eval(Container.DataItem, "docfileencr") %>' 
            Target="_blank" runat="server" /> 
           <br /> 
          </td> 
         </tr> 
        </table> 
       </ItemTemplate> 
      </asp:DataList> 

protected void DataList1_ItemDataBound(Object sender, DataListItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     var row = (DataRowView)e.Item.DataItem; 
     var view = row.DataView; 
     var lastRow = e.Item.ItemIndex == 0 ? null : view[e.Item.ItemIndex - 1]; 
     var tr_category = (System.Web.UI.HtmlControls.HtmlTableRow)e.Item.FindControl("tr_category"); 
     var sameCategory = lastRow != null && (int)row["catid"] == (int)lastRow["catid"]; 
     tr_category.Visible = !sameCategory; 
    } 
} 

protected void CheckAllChanged(Object sender, EventArgs e) 
{ 
    RadioButton checkAll = (RadioButton)sender; 
    DataListItem item = (DataListItem)checkAll.NamingContainer; 
    HiddenField HiddenCatID = (HiddenField)item.FindControl("HiddenCatID"); 

    var catCheckBoxes = DataList1.Items.Cast<DataListItem>() 
     .Where(li => ((HiddenField)li.FindControl("HiddenCatID")).Value == HiddenCatID.Value) 
     .Select(li => li.FindControl("cb_docid")) 
     .ToList(); 
    foreach (CheckBox docCheckBox in catCheckBoxes) 
    { 
     // docCheckBox.Checked = checkAll.Checked; 
     docCheckBox.Checked = true; 
    } 
} 

protected void CheckAllChangedNone(Object sender, EventArgs e) 
{ 
    RadioButton checkAll = (RadioButton)sender; 
    DataListItem item = (DataListItem)checkAll.NamingContainer; 
    HiddenField HiddenCatID = (HiddenField)item.FindControl("HiddenCatID"); 

    var catCheckBoxes = DataList1.Items.Cast<DataListItem>() 
     .Where(li => ((HiddenField)li.FindControl("HiddenCatID")).Value == HiddenCatID.Value) 
     .Select(li => li.FindControl("cb_docid")) 
     .ToList(); 

    foreach (CheckBox docCheckBox in catCheckBoxes) 
    { 
     docCheckBox.Checked = false; 
    } 


} 

// неполный код из последовательности заказа; обратите внимание на использование HiddenField

CheckBox cb = li.FindControl("cb_docid") as CheckBox; 

     if (cb != null) 
     { 
      if (cb.Checked) 
      { 
       HiddenField docid = li.FindControl("HiddenDocID") as HiddenField; 
       string dbcmd = @"Insert Into [order_details] (orderid,docid) Values (" + orderid + "," + docid.Value.ToString() + ")"; 
Смежные вопросы