ASP.NET:如何访问中继器所产生的形式输入的单元?
-
05-07-2019 - |
题
我希望有一个中继器产生一堆框,例如:
<tr><td><input type="checkbox" name="t" value="11cbf4deb87" /> <input type="checkbox" name="a" value="33cbf4deb87" />stackoverflow.com</td></tr>
<tr><td><input type="checkbox" name="t" value="11cbf4deb88" /> <input type="checkbox" name="a" value="33cbf4deb87" />microsoft.com</td></tr>
<tr><td><input type="checkbox" name="t" value="11cd3f33a89" /> <input type="checkbox" name="a" value="33cbf4deb87" />gmail.com</td></tr>
<tr><td><input type="checkbox" name="t" value="1138fecd337" /> <input type="checkbox" name="a" value="33cbf4deb87" />youporn.com</td></tr>
<tr><td><input type="checkbox" name="t" value="11009efdacc" /> <input type="checkbox" name="a" value="33bf4deb87" />fantasti.cc</td></tr>
问题1:我该如何单独的参考每一个框当中继器运行所以我可以设置独特的价值?
做我的数据结合它与这样的:
<itemtemplate>
<tr>
<td>
<input type="checkbox" name="t"
value="<%# ((Item)Container.DataItem).TangoUniquifier %>" />
<input type="checkbox" name="a"
value="<%# ((Item)Container.DataItem).AlphaUniquifier %>" />
<%# ((Item)Container.DataItem).SiteName %>
</td>
</tr>
</itemtemplate>
或者我应该把它设置以某种方式在OnItemDataBound?
<asp:repeater id="ItemsRepeater"
OnItemDataBound="ItemsRepeater_OnItemDataBound" runat="server">
...
<itemtemplate>
<tr>
<td>
<input id="chkTango" type="checkbox" name="t" runat="server" />
<input id="chkAlpha" type="checkbox" name="a" runat="server" />
<%# ((Item)Container.DataItem).SiteName %>
</td>
</tr>
</itemtemplate>
...
</asp:repeater>
protected void ItemsRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
// if the data bound item is an item or alternating item (not the header etc)
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
// get the associated item
Item item = (Item)e.Item.DataItem;
//???
this.chkTango.Value = item.TangoUniquifier;
this.chkAlpha.Value = item.AlphaUniquifier;
}
}
但如果我就应该参考它的代码隐藏,我怎么参考它的代码隐藏?我应该要参考它的使用(server-side)id酒店的 <INPUT>
控制?我意识到ID的控制服务器上的侧是不一样的ID,将本的客户。
或做我必须做一些事情我必须找到一个输入控制与一个名称中的"t"和另一个姓名的"a"?什么样的控制是一种框允许我设置了它的输入的价值?
protected void ItemsRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
// if the data bound item is an item or alternating item (not the header etc)
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
// get the associated item
Item item = (Item)e.Item.DataItem;
CheckBox chkTango = (CheckBox)e.Item.FindControl("chkTango");
chkTango.Value = item.TangoUniquifier;
CheckBox chkAlpha = (CheckBox)e.Item.FindControl("chkAlpha");
chkAlpha.Value = item.AlphaUniquifier;
}
}
问题2:当用户以后提交的点击,我怎么找到的所有检查的选择框,或者更具体地说他们的价值观?
我必须FindControl?
protected void DoStuffWithLinks_Click(object sender, EventArgs e)
{
// loop through the repeater items
foreach (RepeaterItem repeaterItem in actionItemRepeater.Items)
{
Item item = repeaterItem.DataItem as Item;
// grab the checkboxes
CheckBox chkAlpha = (CheckBox)repeaterItem.FindControl("chkAlpha");
CheckBox chkTango = (CheckBox)repeaterItem.FindControl("chkTango");
if (chkAlpha.Checked)
{
item.DoAlphaStuff(chkAlpha.Name);
}
if (chkTango.Checked)
{
item.DoTangoStuff(chkTango.Name);
}
}
}
是的转发器项目数据项仍然存在一击事件的处理程序?
解决方案
使用该服务器的控制而不是一个输入控制目前=服务器
<asp:CheckBox id="whatever" runat="Server" />
当你设置的价值在你ItemDataBound,你使用FindControl
CheckBox checkBox = (CheckBox)e.Item.FindControl("whatever");
checkBox.Checked = true;
当你得到这项目的,还使用FindControl从该项目在foreach结构。还有,这取决于你如何数据绑定的,该数据项可能不再是有后回发。
foreach (RepeaterItem item in myRepeater.Items)
{
if (item.ItemType == ListItemType.Item
|| item.ItemType == ListItemType.AlternatingItem)
{
CheckBox checkBox = (CheckBox)item.FindControl("whatever");
if (checkBox.Checked)
{ /* do something */ }
}
}
- 许多人都倾向于'安全铸造用
as
操作员用FindControl()
.我不喜欢这样,因为当你改变的控制上的姓名的形式,你可以静静地忽略发展的错误,并使其难以追查。我尝试只能使用as
操作者如果控制不能保证在那里。
更新用于: 其复选哪个? 在呈现html你会最终具有所有这些框样的名字
ctl00_cph0_ParentContainer_MyRepeater_ctl01_MyCheckbox
ctl00_cph0_ParentContainer_MyRepeater_ctl02_MyCheckbox
ctl00_cph0_ParentContainer_MyRepeater_ctl03_MyCheckbox
你不在乎什么名称都是因为foreach项目。FindControl()获取他们对你和你不应该假定他们什么。然而,当你迭代过foreach,你通常需要一种方法,以参照后来的东西。大多数时候这样做是通过也具有asp:HiddenField控制与各框举行一的标识符,以匹配它回到正确的实体。
注意安全:有一个安全问题与使用隐藏的领域,因为一个隐藏的领域可以改变在javascript;总是被发现,这种价值可能已经修改通过之前用户的形式提交。
其他提示
您可能会发现使用CheckBoxList控件更容易。
在简单的情况下,您可以将DataTextVield和DataValueField设置为从数据源中提取的名称和值(假设您从数据源填充),然后绑定它以创建项目。
与在转发器中创建复选框相比,您的工作量可能更少。
以下是如何处理隐藏字段的一些具体代码:
MARKUP:
<asp:HiddenField ID="repeaterhidden" Value='<%# DataBinder.Eval(Container.DataItem, "value")%>' runat="server" >
C#:
{
HiddenField hiddenField = (HiddenField)item.FindControl(repeaterStringhidden);
{ /* do something with hiddenField.Value */
}
我相信这个KB给了我最好的答案:
http://msdn.microsoft.com/en-us/library/ 1d04y8ss.aspx
我自己运气不好,这似乎仅适用于.net 4.0版本(我仍然坚持使用3.5 SP1)。
引用(粗体是我的):
当控件位于生成控件重复实例的数据绑定控件内时,ASP.NET会为控件的每个实例生成 UniqueID和ClientID值。通过组合命名容器的UniqueID值,控件的ID值和序列号生成UniqueID值。在控件中就是这种情况,例如DataList, Repeater ,GridView和ListView控件。
当ClientIDMode属性设置为AutoID时,ASP.NET以类似的方式生成ClientID值。这可能使在客户端脚本中引用控件变得困难,因为您通常无法预测所使用的序列号的值。如果要从客户端脚本访问数据绑定控件,可以将ClientIDMode属性设置为Predictable。这样可以更容易地预测ClientID值的内容。
当您将ClientIDMode设置为Predictable时,您也可以将ClientIDRowSuffixDataKeys属性设置为唯一的数据字段名称,例如数据库表中的主键。这会导致ASP.NET生成一个客户端ID,如果您可以预测数据键值,则可以更容易地在客户端脚本中进行预测和引用。
因此,在3.5版本中,我使用隐藏字段进行操作:
foreach (RepeaterItem item in rptClientes.Items)
{
Panel pnl = (Panel)item.FindControl("divCliente");
Control c = pnl.FindControl("hdnID");
if (c is HiddenField)
{
if (((HiddenField)c).Value == hdnClienteNome.Value)
pnl.BackColor = System.Drawing.Color.Beige;
}
}