代码之家  ›  专栏  ›  技术社区  ›  arnobpl

ASP。无法设置带有DropDownList的SelectedIndex的NET web窗体用户控件

  •  0
  • arnobpl  · 技术社区  · 9 年前

    我创建了一个带有DropDownList的web表单用户控件。我想改变 SelectedIndex 的属性 DropDownList1 以更改所选索引。

    Web用户控件1.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;
            }
        }
    }
    

    现在我在页面中使用用户控件。

    默认.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>
    

    默认.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 进入 选定索引 的属性 下拉列表1 。但如果我将项添加到标记中的DropDownList中,则用户控件会起作用( WebUserControl1.ascx ),而不是在代码隐藏文件中( 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>
    

    但我需要使用代码隐藏文件而不是在标记文件中添加项。为什么它不起作用?如何解决这个问题?

    1 回复  |  直到 9 年前
        1
  •  1
  •   HashPsi    9 年前

    问题是 Page_Load 对于包含用户控件(默认)的页面,执行 之前 页面加载(_L) 用于用户控件(WebUserControl1)。因此,当 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());
      }
    }