获取ASP.Net 2.0 Repeater控件中的当前索引

时间:2009-08-31 20:15:05

标签: .net asp.net drop-down-menu repeater

也许这很容易做到,但到目前为止,我花了一整天的时间才能有所作为。

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

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

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

希望它足够清楚,有人可以帮助我。

谢谢!

修改 也许这是不够清楚的事情:当我在转发器中的ItemTemplate中放置ID =“ddlSomething”的控件时,我在数据源中有5行,转发器中有5行ddl具有相同的id(在服务器端,在客户端将是类似“ctl01 $ ddlSomething”,“ctl02 $ ddlSomething”。 我的问题是,当ddl回发时,我不知道这些中的哪一个(例如)ddl是回发的那个,因为只看了Request.Form变量我可以看到控件“ddlSomething”发了它

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

在FormView中,您可以执行以下操作,也许它也适用于转发器:

在DDL HTML标记中,将id的属性添加到DDL元素:

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

在该元素的回发中获取该ID:

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

编辑:如果您有一个Employees表,其中包含employee_name,employee_type和employee_id 您可能有arepeater打印员工姓名和员工类型,其中员工类型是具有全职,兼职等的DLL。 您可以以声明方式将其添加到DDL的标记中:

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

并在DDL回发中:

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

答案 2 :(得分: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”就是您的事件被触发的行。因此,您可以完全访问该行中的其他控件,而不仅仅是您的下拉列表。

答案 3 :(得分:0)

转发器本身无法告诉您选择了哪个控件,因为您指定的项目模板可能包含任何控件组合,并且可能无法将其指定为“已选择”

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

否则,遍历控件并找到选择的控件。 例如,您可以遍历每一行并查找发送DDL,如下所示:

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

答案 4 :(得分:0)

在Repeater中放置一个标签并将其绑定,然后在DropDownList的SelectedIndexChanged中,您可以获得如下值:

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

问候。