2009-08-31 66 views
3

也许这件事很容易做到,但到目前为止,它需要我整天工作。获取ASP.Net 2.0 Repeater控件中的当前索引

我有一个中继器充满了表。转发器中的每一行都有一组控件。其中最重要的是具有AutoPostback = true的下拉列表。

当用户更改所选索引时,此ddl必须回发,以便我可以在ddl内隐藏/显示控件。

问题是,当用户更改ddl中的选定索引以及控制回发时,在服务器端,我无法获取包含回发的ddl的行的索引。

希望它很清楚,并且有人可以帮助我。

谢谢!

编辑: 也许这是一件不太清楚:当我把与ID =“ddlSomething”控制一个ItemTemplate内的中继器,而我在数据源中有5行,我会在中继器有5行与5 ddl与相同的ID(在服务器端,在客户端将是类似于“ctl01 $ ddlSomething”,“ctl02 $ ddlSomething” 我的问题是,当ddl回发,我不知道这5个(例如)ddl中的哪一个是回发的,因为只要查看Request.Form变量,我就可以看到控件“ddlSomething”创建了它。

回答

5

尝试:

<asp:DropDownList runat="server" id="myDDL" OnSelectedIndexChanged="myDDL_Changed" /> 

//fired when the DDL selected index changes 
void myDDL_Changed(object sender, EventArgs e) 
{ 
    //sender is the ddl 
    DropDownList theDropDown = sender as DropDownList; 
    int repeaterItemIndex = ((RepeaterItem)theDropDown.NamingContainer).ItemIndex; 
} 
+0

我不明白Rex ...在哪种情况下会发生这种情况?所有的DDL在服务器端都有相同的ID ...我该怎么做?我设法得到关于它的一些信息的唯一方法是使用Request.Form变量在Page_load中。 – Sebastian 2009-08-31 20:43:22

+0

@塞巴斯蒂安看到我修改后的答案。 – 2009-08-31 20:49:00

+0

非常感谢雷克斯M,这似乎是最好的事情! – Sebastian 2009-08-31 21:16:32

1

在FormView中,可以做以下,也许它会在代表工作食,以及:

在DDL HTML标记添加属性的ID到DDL元件:

MyID='<%# Eval("MyID") %>' 

在回发该元素抢ID:

int intID = Convert.ToInt32((sender as DropDownList).Attributes["MyID"]); 
..... 

编辑:如果员工表中有employee_name,employee_type和employee_id 您可能会打印出员工姓名和员工类型,其中员工类型是全职,兼职等的DLL。 您可以添加此声明性的y以DLL的标记:

MyID='<%# Eval("employee_id") %>' 

,并在DDL回传:

int employeeID = Convert.ToInt32((sender as DropDownList).Attributes["MyID"]); 
+0

“MyID”在哪里定义? – 2009-08-31 20:34:00

+0

MyID是您自己的自定义HTML属性。它不是在任何地方定义的,而是在您的标记中。请记住,尽管此解决方案可行,但由于无法识别的属性,您将收到HTML验证错误。尽管如此,没什么好烦恼的。 – 2009-08-31 20:36:11

+0

我的意思是,DataItem中的“MyID”定义在哪里? MyID必须是Eval()的DataItem成员才能绑定到它。 – 2009-08-31 20:51:24

0

中继本身不能告诉你,它控制选择,因为您指定的项目模板可能包含控件的任意组合,并且可能没有办法将其中的一个指定为“已选中”

您将不得不检查中继器列表中的内部控件。由于您正在创建表格,因此您可以检查表格的选定索引而不是检查转发器的选定索引。

否则,遍历控件并找到哪个被选中。 例如,您可以通过每一行迭代,并查找发送DDL,这样的事情:

for(...) 
    { 
     if(containingElement.Controls.Find(sender.ID)) 
     { 
     // You found it! 
     } 
     // otherwise keep looking... 
    } 
1

我可能会或可能不会在这里下车的标志塞巴斯蒂安,但我相信你想泡的事件。

例如,从你的解释我是你正在做的事情,如印象:

<asp:Repeater id="myRepeater" runat="server"> 
    <ItemTemplate> 
     <asp:DropDownList ID="ddlSomething" AutoPostBack="true" runat="server"></asp:DropDownList> 
    </ItemTemplate> 
</asp:Repeater> 

要从中继器中捕获一个事件,你可以使用属性“OnItemCommand”,即:

<asp:Repeater id="myRepeater" OnItemCommand="SomeEvent_ItemCommand" runat="server"> 
     <ItemTemplate> 
      <asp:DropDownList ID="ddlSomething" AutoPostBack="true" runat="server"></asp:DropDownList> 
     </ItemTemplate> 
    </asp:Repeater> 

在后面的代码,你现在能做到以下几点:

protected void SomeEvent_ItemCommand(object sender, RepeaterCommandEventArgs e) 
     { 
      if (e.CommandSource.GetType() == typeof(DropDownList)) 
      { 
       DropDownList ddlSomething = (DropDownList)e.Item.FindControl("ddlSomething"); 

       //Now you can access your list that fired the event 
       SomeStaticClass.Update(ddlSomething.SelectedIndex); 
      } 
     } 

我希望我在这里没有走错路,但我认为这是你要拍摄的东西。

编辑:

在这里补充一个小注释,上面的“e.Item”是有你的事件该行已经烧制而成。因此,您可以完全访问该行中的其他控件,而不仅仅是您的下拉列表。

+0

我认为这是一个很好的答案Alexis,谢谢。我稍后再尝试,但首先需要发货! :p – Sebastian 2009-08-31 21:17:36

0

将在您的中继器的拉布勒,并将其绑定,然后在你的DropDownList的的SelectedIndexChanged可以获取价值如下:

Dim ddl = DirectCast(sender, DropDownList) 
Dim lbl = DirectCast(DirectCast(ddl.NamingContainer,RepeaterItem).FindControl("Label1"),Label) 

问候。

相关问题