【发布时间】:2011-01-19 18:03:45
【问题描述】:
我有三个下拉列表控件。每个下拉列表包含静态值 1、2、3、4 我需要做的是在第一个下拉列表中选择一个项目时(在 SelectedIndexChanged 事件上)应该在其他两个下拉列表中选择相同的项目
【问题讨论】:
我有三个下拉列表控件。每个下拉列表包含静态值 1、2、3、4 我需要做的是在第一个下拉列表中选择一个项目时(在 SelectedIndexChanged 事件上)应该在其他两个下拉列表中选择相同的项目
【问题讨论】:
这就是你要做的。
在 ASPX 代码中:
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddl_SelectedIndexChanged">
<asp:ListItem Text="1" Value="1" />
<asp:ListItem Text="2" Value="2" />
<asp:ListItem Text="3" Value="3" />
<asp:ListItem Text="4" Value="4" />
</asp:DropDownList>
<asp:DropDownList ID="DropDownList2" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddl_SelectedIndexChanged">
<asp:ListItem Text="1" Value="1" />
<asp:ListItem Text="2" Value="2" />
<asp:ListItem Text="3" Value="3" />
<asp:ListItem Text="4" Value="4" />
</asp:DropDownList>
<asp:DropDownList ID="DropDownList3" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddl_SelectedIndexChanged">
<asp:ListItem Text="1" Value="1" />
<asp:ListItem Text="2" Value="2" />
<asp:ListItem Text="3" Value="3" />
<asp:ListItem Text="4" Value="4" />
</asp:DropDownList>
在代码隐藏中:
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList ddl = (DropDownList)sender;
string value = ddl.SelectedValue;
SetValue(DropDownList1, value);
SetValue(DropDownList2, value);
SetValue(DropDownList3, value);
}
protected void SetValue(DropDownList ddl, string value)
{
ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(value));
}
只输入ddl1.SelectedValue = ddl2.SelectedValue 是行不通的,因为DropDownList.SelectedValue 是只读的。
请注意,我不只是将所有 DDL 的 SelectedIndex 设置为发件人的。您可以在示例场景中使用它,但如果您的某个 DDL 的 ListItem 的顺序与其他 DDL 的顺序不同,则代码将中断。在我看来,这使它成为危险的做法,但是 YMMV。
另外,如果您决定推广 SetValue 方法(我经常将其作为扩展方法添加到整个项目中的 DropDownList 控件),您应该处理在 DDL 中找不到目标值的情况,大概是通过抛出异常。您也可以使用 FindByText 制作 SetText 版本。
【讨论】:
将第二个和第三个下拉列表中的 selectedvalue 属性设置为第一个下拉列表中的选定值。将 DropDown 设置为 autopostback="true" 以便它回发到服务器,您可以适当地设置它。
或者,当更改客户端事件第一次触发时,使用客户端 JavaScript 更改其他选择元素上的 selectedindex 属性。
【讨论】:
您需要做的就是设置其他下拉列表的SelectedIndex,如下所示:
protected void DropDownList1SelectedIndexChanged(Object sender, EventArgs e)
{
dropDownList2.SelectedIndex = dropDownList1.SelectedIndex;
dropDownList3.SelectedIndex = dropDownList1.SelectedIndex;
}
【讨论】:
尝试以下方法:
标记:
<asp:DropDownList ID="dd1" OnSelectedIndexChanged="dd1_SelectedIndexChanged" AutoPostBack="true" runat="server" />
<asp:DropDownList ID="dd2" runat="server" />
<asp:DropDownList ID="dd3" runat="server" />
代码隐藏:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
BindData();
}
protected void dd1_SelectedIndexChanged(object sender, EventArgs e)
{
string selected = dd1.SelectedValue;
dd1.SelectedValue = dd2.SelectedValue = dd3.SelectedValue = selected;
BindData();
}
private void BindData()
{
int[] values = { 1, 2, 3, 4 };
dd1.DataSource = dd2.DataSource = dd3.DataSource = values;
dd1.DataBind();
dd2.DataBind();
dd3.DataBind();
}
【讨论】:
dd1.SelectedValue = dd2.SelectedValue 会导致错误,因为这是一个只读属性。