2014-09-16 2 views
1

У меня есть страница ASPX, в которой есть PlaceHolder, в которой пользовательские элементы управления загружаются динамически. HTML разметка выглядит следующим образом:DropDownList в User Control теряет SelectedValue при первом обратном обращении при динамическом загрузке

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Test" %> 

<!DOCTYPE html> 

<html> 
<head runat="server"> 
</head> 
<body> 
    <form id="form1" runat="server"> 

     <asp:Button ID="btnNumbers" Text="Select Numbers" OnClick="SelectNumbers" runat="server" /> 
     <br /><br /> 
     <asp:Button ID="btnLetters" Text="Select Letters" OnClick="SelectLetters" runat="server" /> 
     <br /><br /> 

     <asp:PlaceHolder ID="phContent" runat="server" /> 

    </form> 
</body> 
</html> 

Кодекс Позади выглядит следующим образом:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 


public partial class Test : System.Web.UI.Page 
{ 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
      HttpContext.Current.Session["control"] = "~/Controls/Numbers.ascx"; 
     LoadControl();   
    } 

    protected void SelectNumbers(object sender, EventArgs e) 
    { 
     HttpContext.Current.Session["control"] = "~/Controls/Numbers.ascx"; 
     LoadControl(); 
    } 

    protected void SelectLetters(object sender, EventArgs e) 
    { 
     HttpContext.Current.Session["control"] = "~/Controls/Letters.ascx"; 
     LoadControl(); 
    } 

    private void LoadControl() 
    { 
     phContent.Controls.Clear(); 
     var control = Page.LoadControl((String)HttpContext.Current.Session["control"]); 
     phContent.Controls.Add(control); 
    } 
} 

Первый пользовательский элемент управления имеет DropDownList для выбора номера. Он имеет разметку следующим образом:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Numbers.ascx.cs" Inherits="Numbers" %> 


<asp:DropDownList ID="ddlSelectNumbers" 
        AutoPostBack="true" runat="server" 
        OnSelectedIndexChanged="SelectNumbers_IndexChanged" > 
    <asp:ListItem Text="One" Value="1" /> 
    <asp:ListItem Text="Two" Value="2" /> 
    <asp:ListItem Text="Three" Value="3" /> 
</asp:DropDownList> 

<br /><br /> 

<asp:Label ID="lblSelectedNumber" runat="server" /> 

И код За следующим образом:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.IO; 
using Superexpert.Controls; 


public partial class Numbers : System.Web.UI.UserControl 
{ 
    public override String ID 
    { 
     get { return "Numbers"; } 
     set { } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void SelectNumbers_IndexChanged(object sender, EventArgs e) 
    { 
     lblSelectedNumber.Text = ((DropDownList)sender).SelectedItem.Text; 
    } 
} 

Второй пользовательский элемент управления имеет DropDownList, чтобы выбрать буквы. Он имеет разметку следующим образом:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Letters.ascx.cs" Inherits="Letters" %> 



<asp:DropDownList ID="ddlSelectLetters" 
        AutoPostBack="true" runat="server" 
        OnSelectedIndexChanged="SelectLetters_IndexChanged" > 
    <asp:ListItem Text="A" Value="a" /> 
    <asp:ListItem Text="B" Value="b" /> 
    <asp:ListItem Text="C" Value="c" /> 
</asp:DropDownList> 

<br /><br /> 

<asp:Label ID="lblSelectedLetter" runat="server" /> 

И коды За следующим образом:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.IO; 
using Superexpert.Controls; 


public partial class Letters : System.Web.UI.UserControl 
{ 
    public override String ID 
    { 
     get { return "Letters"; } 
     set { } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void SelectLetters_IndexChanged(object sender, EventArgs e) 
    { 
     lblSelectedLetter.Text = ((DropDownList)sender).SelectedItem.Text; 
    } 
} 

Все работает найти, когда первую загрузку страницы (IsPostBack!). Вы можете выбирать числа из DropDownList и запускать событие SelectedItemChanged, обновляется SelectedValue, а Label обновляется.

Проблема возникает, когда вы нажимаете одну из кнопок для динамической загрузки одного из элементов управления пользователя. После этого, когда вы выбираете что-то из DropDownList, событие SelectedItemChanged не срабатывает, его SelectedValue не обновляется, и поэтому Label не обновляется. Впоследствии все работает нормально.

Что вызывает это?

Заранее благодарен!

ответ

1

Вы очень закрыты. Вам просто нужно назначить идентификатор динамически созданному элементу управления.

В принципе, вам нужно назначить идентификатор динамически созданному элементу управления, если вы хотите получить их при отправке назад.

Посмотрите на 3 <--- в следующем коде.

public partial class Test : System.Web.UI.Page 
{ 
    ... Same as above 

    private void LoadControl() 
    { 
     phContent.Controls.Clear(); 
     var control = Page.LoadControl((String)HttpContext.Current.Session["control"]); 
     control.ID = "1"; <--- 1. Control ID is required. 
     phContent.Controls.Add(control); 
    } 
} 

public partial class Numbers : System.Web.UI.UserControl 
{ 
    // public override String ID ... <--- 2. Remove this 

    protected void SelectNumbers_IndexChanged(object sender, EventArgs e) 
    { 
     lblSelectedNumber.Text = ((DropDownList)sender).SelectedItem.Text; 
    } 
} 

public partial class Letters : System.Web.UI.UserControl 
{ 
    // public override String ID ... <--- 3. Remove this 

    protected void SelectLetters_IndexChanged(object sender, EventArgs e) 
    { 
     lblSelectedLetter.Text = ((DropDownList)sender).SelectedItem.Text; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^