Пользовательский элемент управления веб-форм ASP.NET с SelectedIndex DropDownList не может быть установлен

Я создал пользовательский элемент управления веб-форм с DropDownList. я хочу измениться SelectedIndex собственностью 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 в SelectedIndex собственностью DropDownList1, Но пользовательский элемент управления работает, если я добавляю элементы в DropDownList в разметке (WebUserControl1.ascx), а не в файле codebehind (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>

Но мне нужно добавить элементы, используя файл codebehind, а не в файле разметки. Почему это не работает? Как решить проблему?

1 ответ

Решение

Проблема в том, что Page_Load для страницы, содержащей пользовательский элемент управления (по умолчанию), выполняется раньше Page_Load для пользовательского элемента управления (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());
  }
}
Другие вопросы по тегам