当前位置:  开发笔记 > 编程语言 > 正文

ASP.NET:如何访问转发器生成的表单输入元素?

如何解决《ASP.NET:如何访问转发器生成的表单输入元素?》经验,为你挑选了1个好方法。

我想要一个转发器生成一堆复选框,例如:

 stackoverflow.com
 microsoft.com
 gmail.com
 youporn.com
 fantasti.cc

问题1:如何在转发器运行时单独引用每个复选框,以便设置唯一值?

我用以下内容对数据进行数据绑定:


   
      
         
         
         <%# ((Item)Container.DataItem).SiteName %>
      
   

或者我应该在OnItemDataBound中以某种方式设置它?


   ...
   
      
         
            
            
            <%# ((Item)Container.DataItem).SiteName %>
         
      
   
   ...



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;
   }
}

但是,如果我应该在代码隐藏中引用它,我如何在代码隐藏中引用它?我应该使用控件的(服务器端)id属性来引用它吗?我意识到服务器端控件的ID与客户端上的ID不同.

或者我必须做一些事情,我必须找到一个名为"t"的INPUT控件和另一个名为"a"的控件?什么样的控件是CheckBox允许我设置它的输入值?

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);
      }
   }
}

转发器项DataItem是否仍然存在于单击事件处理程序中?



1> Robert Pauls..:

使用服务器控件而不是输入控件runat = server

 

在ItemDataBound中设置值时,使用FindControl

CheckBox checkBox = (CheckBox)e.Item.FindControl("whatever");
checkBox.Checked = true;

获取项目时,还可以使用foreach构造中项目的FindControl.此外,根据您对数据绑定的方式,DataItem可能在回发后不再存在.

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如果不保证控件在那里,我尝试仅使用操作符.

更新:哪个CheckBox是哪个?在渲染的html中,你最终会拥有所有这些复选框名称

ctl00_cph0_ParentContainer_MyRepeater_ctl01_MyCheckbox
ctl00_cph0_ParentContainer_MyRepeater_ctl02_MyCheckbox
ctl00_cph0_ParentContainer_MyRepeater_ctl03_MyCheckbox

你不关心名字是什么,因为foreach item.FindControl()为你获取它们,你不应该假设它们.但是,当您通过foreach进行迭代时,通常需要一种方法来将其引用回某些东西.大多数情况下,这是通过在每个CheckBox旁边使用asp:HiddenField控件来保存标识符以将其匹配回正确的实体来完成的.

安全说明:使用隐藏字段存在安全问题,因为隐藏字段可以在javascript中更改; 始终意识到在提交表单之前用户可能已修改此值.

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有