也许这很容易做到,但到目前为止,我花了一整天的时间才能有所作为。
我有一张充满桌子的转发器。转发器中的每一行都有一组控件。其中最重要的是AutoPostback = true的下拉列表。
当用户更改所选索引时,此ddl必须回发,以便隐藏/显示ddl中的控件。
问题是当用户更改ddl中的选定索引和控制回发时,在服务器端,我无法获取包含回发的ddl的行的索引。
希望它足够清楚,有人可以帮助我。
谢谢!
修改 也许这是不够清楚的事情:当我在转发器中的ItemTemplate中放置ID =“ddlSomething”的控件时,我在数据源中有5行,转发器中有5行ddl具有相同的id(在服务器端,在客户端将是类似“ctl01 $ ddlSomething”,“ctl02 $ ddlSomething”。 我的问题是,当ddl回发时,我不知道这些中的哪一个(例如)ddl是回发的那个,因为只看了Request.Form变量我可以看到控件“ddlSomething”发了它
答案 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)
问候。