中继器,数据表和复选框启用/禁用

时间:2013-12-20 13:46:36

标签: c# asp.net checkbox repeater

我有一个asp Repeater,它的DataSource是一个DataTable(包含来自数据库的数据)。 在第一次加载页面时,DataTable从db填充,然后其数据绑定到Repeater。 然后我将DataTable放入ViewState,并在回发时使用ViewState中的DataTable,然后只有在用户完成所有操作后才能在数据库中注入数据。

可以将一些行添加到Repeater中(通过添加到viewstate的DataTable并重新绑定)。

这是Repeater的代码:

  <asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:HiddenField ID="HdfHiddenRow" ClientIDMode="Static" runat="server" />
        <asp:HiddenField ID="HdfHiddenId" ClientIDMode="Static" runat="server" />
        <div style="display:none;">
            <asp:Button ID="BtnHiddenButton" runat="server" Text="" OnClick="BtnHiddenButton_Click" />
        </div>
        <table id="TableEI" style="width: 800px; margin-left:50px;" cellpadding="0" cellspacing="0">
            <asp:Repeater ID="Repeat_EffetsIndes" runat="server" OnItemDataBound="Repeat_EffetsIndes_ItemDataBound" >
                <ItemTemplate>
                    <tr>
                        <td style="width: 431px;">
                            <asp:Label ID="LblEI" runat="server" />
                        </td>
                        <td class="auto-style1">
                            <asp:CheckBox ID="CheckOui" ClientIDMode="Static" runat="server" Text="Yes" onclick="CheckedLine(this)" />
                        </td>
                        <td>
                            <asp:CheckBox ID="CheckOui1" ClientIDMode="Static" runat="server" Enabled="false" Text="some text1" />   
                            <br />
                            <asp:CheckBox ID="CheckOui2" ClientIDMode="Static" runat="server" Enabled="false" Text="some text2" />
                            <br />
                            <asp:CheckBox ID="CheckOui3" ClientIDMode="Static" runat="server" Enabled="false" Text="some text3" />
                        </td>
                    </tr>
                </ItemTemplate>
            </asp:Repeater>
        </table>
.....
[textbox + button to add new row there]
.....   
   </ContentTemplate>
</asp:UpdatePanel>

检查我的Repeater中的行示例:

http://img4.hostingpics.net/pics/356954example.png

当第一个复选框(是)被选中时:它启用3个右侧复选框。 (这已经通过javascript完成了)

我必须为每行的4个复选框提供一个唯一的ID,并且能够识别在选中父级时必须启用哪些复选框。 我在Repeater的ItemDataBound事件上给出了一个唯一的ID。

protected void Repeat_EffetsIndes_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        DataRowView drv = e.Item.DataItem as DataRowView;
        ((Label)e.Item.FindControl("LblEI")).Text = drv["Suivi_EffetsIndes_Label"].ToString();

        CheckBox ParentCheckBox = ((CheckBox)e.Item.FindControl("CheckOui"));
        CheckBox ChildCheckBox1 = ((CheckBox)e.Item.FindControl("CheckOui1"));
        CheckBox ChildCheckBox2 = ((CheckBox)e.Item.FindControl("CheckOui2"));
        CheckBox ChildCheckBox3 = ((CheckBox)e.Item.FindControl("CheckOui3"));

        string _IdPrefix = Guid.NewGuid().ToString().Replace("-", "");

        // Affectation d'un ID unique à chaque checkbox "Oui" 
        ParentCheckBox.ID = _IdPrefix;
        // Concaténation de l'ID de la checkbox parent (Oui) et d'un chiffre pour identifier les checkboxes.
        ChildCheckBox1.ID = _IdPrefix + "1";
        ChildCheckBox2.ID = _IdPrefix + "2";
        ChildCheckBox3.ID = _IdPrefix + "3";
  }

问题

当选中3个右侧复选框之一时,我想直接更新ViewState数据表中的正确值(设置字段“选中”从0到1)。

问题是我有一些麻烦来抓住复选框的“CheckedChanged”,不知道为什么,而且复选框的“ID”似乎总是设置为默认值,所以我可以通过例如,写“Repeater.Items [x] .FindControl(”CheckOui1“)并不一定可能,因为我给了他们一个新的ID,这要归功于我希望找到哪个复选框

(为我不完美的英文写作道歉)

1 个答案:

答案 0 :(得分:0)

我在您的代码中看到的唯一问题是您使用GUID来设置Checkboxes ID这是错误的,因为每次重新绑定转发器或刷新页面时,ID都将是完全不同。

所以我建议你做以下步骤:

  1. 从复选框中删除ClientIDMode属性。通过执行此操作,HTML上的复选框ID将类似于此Repeat_EffectsIndes_CheckOui_0(您可以使用Firebug或浏览器的选项Inspect Element标识每个唯一ID)。

  2. 在Javascript上,验证选中了哪个复选框,获取ID并启用其他3个复选框(我已经完成了相同的操作)。其他3个复选框的ID将类似于Repeat_EffectsIndes_CheckOui_0_CheckOui1(其余部分相同,除了最后一个数字),0(零)是行索引。

  3. 最后,在您的代码隐藏页面上,使用Repeater.Items[x].FindControl("<CheckBoxID>"),其中<CheckBoxID>是控件ID。

  4. 希望它有所帮助。