我有一个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,这要归功于我希望找到哪个复选框
(为我不完美的英文写作道歉)
答案 0 :(得分:0)
我在您的代码中看到的唯一问题是您使用GUID
来设置Checkboxes ID这是错误的,因为每次重新绑定转发器或刷新页面时,ID都将是完全不同。
所以我建议你做以下步骤:
从复选框中删除ClientIDMode
属性。通过执行此操作,HTML上的复选框ID将类似于此Repeat_EffectsIndes_CheckOui_0
(您可以使用Firebug或浏览器的选项Inspect Element标识每个唯一ID)。
在Javascript上,验证选中了哪个复选框,获取ID并启用其他3个复选框(我已经完成了相同的操作)。其他3个复选框的ID将类似于Repeat_EffectsIndes_CheckOui_0_CheckOui1
(其余部分相同,除了最后一个数字),0(零)是行索引。
最后,在您的代码隐藏页面上,使用Repeater.Items[x].FindControl("<CheckBoxID>")
,其中<CheckBoxID>
是控件ID。
希望它有所帮助。