ASP.NET 无法设置带有 DropDownList 的 SelectedIndex 的 Web 表单用户控件
ASP.NET web forms user control with DropDownList's SelectedIndex cannot be set
我创建了一个带有 DropDownList 的 Web 表单用户控件。我想更改 SelectedIndex
属性 of DropDownList1
以更改所选索引。
WebUserControl1.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="WebApplication1.ControlUI.WebUserControl1" %>
<asp:DropDownList ID="DropDownList1" runat="server">
</asp:DropDownList>
WebUserControl1.ascx.cs:
using System;
namespace WebApplication1.ControlUI
{
public partial class WebUserControl1 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e) {
if (IsPostBack) return;
for (int i = 1; i <= 5; i++) {
DropDownList1.Items.Add("Test: " + i.ToString());
}
}
public void SetSelectedIndex(int index) {
DropDownList1.SelectedIndex = index;
}
}
}
现在我在页面中使用用户控件。
Default.aspx:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>
<%@ Register Src="~/ControlUI/WebUserControl1.ascx" TagPrefix="uc1" TagName="WebUserControl1" %>
<asp:Content ID="HeadContent" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
<uc1:WebUserControl1 runat="server" id="WebUserControl1" />
</asp:Content>
Default.aspx.cs:
using System;
using System.Web.UI;
namespace WebApplication1
{
public partial class Default : Page
{
protected void Page_Load(object sender, EventArgs e) {
WebUserControl1.SetSelectedIndex(3);
}
}
}
这不起作用。它将 -1 分配给 DropDownList1
的 SelectedIndex
属性。但是,如果我在标记 (WebUserControl1.ascx
) 中将项目添加到 DropDownList 中,而不是在代码隐藏文件 (WebUserControl1.ascx.cs
) 中添加项目,则用户控件会起作用:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="WebApplication1.ControlUI.WebUserControl1" %>
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>Test: 1</asp:ListItem>
<asp:ListItem>Test: 2</asp:ListItem>
<asp:ListItem>Test: 3</asp:ListItem>
<asp:ListItem>Test: 4</asp:ListItem>
<asp:ListItem>Test: 5</asp:ListItem>
</asp:DropDownList>
但我需要使用代码隐藏文件添加项目,而不是在标记文件中。为什么它不起作用?如何解决问题?
问题是包含用户控件(默认)的页面 Page_Load
在用户控件 (WebUserControl1) Page_Load
之前执行 。因此,当从页面调用 SetSelectedIndex
时,首次构建页面时下拉菜单中没有任何列表项。
您可以通过在用户控件生命周期的 Init
阶段而不是 Load
阶段为下拉列表创建列表项来非常简单地解决问题:
protected void Page_Init(object sender, EventArgs e) {
if (IsPostBack) return;
for (int i = 1; i <= 5; i++) {
DropDownList1.Items.Add("Test: " + i.ToString());
}
}
我创建了一个带有 DropDownList 的 Web 表单用户控件。我想更改 SelectedIndex
属性 of DropDownList1
以更改所选索引。
WebUserControl1.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="WebApplication1.ControlUI.WebUserControl1" %>
<asp:DropDownList ID="DropDownList1" runat="server">
</asp:DropDownList>
WebUserControl1.ascx.cs:
using System;
namespace WebApplication1.ControlUI
{
public partial class WebUserControl1 : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e) {
if (IsPostBack) return;
for (int i = 1; i <= 5; i++) {
DropDownList1.Items.Add("Test: " + i.ToString());
}
}
public void SetSelectedIndex(int index) {
DropDownList1.SelectedIndex = index;
}
}
}
现在我在页面中使用用户控件。
Default.aspx:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>
<%@ Register Src="~/ControlUI/WebUserControl1.ascx" TagPrefix="uc1" TagName="WebUserControl1" %>
<asp:Content ID="HeadContent" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
<uc1:WebUserControl1 runat="server" id="WebUserControl1" />
</asp:Content>
Default.aspx.cs:
using System;
using System.Web.UI;
namespace WebApplication1
{
public partial class Default : Page
{
protected void Page_Load(object sender, EventArgs e) {
WebUserControl1.SetSelectedIndex(3);
}
}
}
这不起作用。它将 -1 分配给 DropDownList1
的 SelectedIndex
属性。但是,如果我在标记 (WebUserControl1.ascx
) 中将项目添加到 DropDownList 中,而不是在代码隐藏文件 (WebUserControl1.ascx.cs
) 中添加项目,则用户控件会起作用:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="WebApplication1.ControlUI.WebUserControl1" %>
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>Test: 1</asp:ListItem>
<asp:ListItem>Test: 2</asp:ListItem>
<asp:ListItem>Test: 3</asp:ListItem>
<asp:ListItem>Test: 4</asp:ListItem>
<asp:ListItem>Test: 5</asp:ListItem>
</asp:DropDownList>
但我需要使用代码隐藏文件添加项目,而不是在标记文件中。为什么它不起作用?如何解决问题?
问题是包含用户控件(默认)的页面 Page_Load
在用户控件 (WebUserControl1) Page_Load
之前执行 。因此,当从页面调用 SetSelectedIndex
时,首次构建页面时下拉菜单中没有任何列表项。
您可以通过在用户控件生命周期的 Init
阶段而不是 Load
阶段为下拉列表创建列表项来非常简单地解决问题:
protected void Page_Init(object sender, EventArgs e) {
if (IsPostBack) return;
for (int i = 1; i <= 5; i++) {
DropDownList1.Items.Add("Test: " + i.ToString());
}
}