Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ASP.NET Новый топик    Ответить
 Интересный вопрос  [new]
k_serg1983
Member

Откуда:
Сообщений: 13
Разметка страницы:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Безымянная страница</title>
</head>
<body>
    <form id="form1" runat="server">
    
        <asp:Panel ID="pnlConfiguration" runat="server">
        </asp:Panel>
    </form>
</body>
</html>

Код страницы:
using System;
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Test test = Page.LoadControl("~/Test.ascx") as Test;
        if (test != null)
        {
            test.ID = "ctl1";
            pnlConfiguration.Controls.Clear();
            pnlConfiguration.Controls.Add(test);
        }
    }
}

Разметка загружаемого контрола:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Test.ascx.cs" Inherits="Test" %>

<div>
    <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
        onselectedindexchanged="DropDownList1_SelectedIndexChanged">
    </asp:DropDownList>
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>

Код загружаемого контрола:
using System.Web.UI;
using System;
using System.Data;
public partial class Test : UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            LoadTestData();
            Label1.Text = DropDownList1.SelectedValue;
        }
    }

    private void LoadTestData()
    {
        DropDownList1.DataSource = MakeSource();
        DropDownList1.DataTextField = "Name";
        DropDownList1.DataValueField = "Value";
        DropDownList1.DataBind();
    }

    private DataTable MakeSource()
    {
        DataTable dt = new DataTable();
        DataColumn dcName = new DataColumn("Name");
        DataColumn dcValue = new DataColumn("Value");
        dt.Columns.Add(dcName);
        dt.Columns.Add(dcValue);
        dt.Rows.Add(new object[] { "Test1", 1 });
        dt.Rows.Add(new object[] { "Test2", 2 });
        dt.Rows.Add(new object[] { "Test3", 3 });
        dt.Rows.Add(new object[] { "Test4", 4 });

        return dt;
    }

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Label1.Text = DropDownList1.SelectedValue;
    }
}

Так вот вопрос в том: почему так контрол не работает нормально (данные DropDownList1 после postBack не восстанавливаются), а после комента
//pnlConfiguration.Controls.Clear(); в коде default.aspx - работает.
Что происходит при pnlConfiguration.Controls.Clear()?
15 май 09, 18:28    [7187129]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
k_serg1983
Member

Откуда:
Сообщений: 13
автор

Что происходит при pnlConfiguration.Controls.Clear()?

Я понимаю что очищается коллекция контролов, но почему это влияет на работоспобосность?

Кроме того, в коллекции Controls панели изначально есть элемент LiteralControl, зачем он нужен?
Еще - с pnlConfiguration.Controls.Clear() не работает только 0 элемент коллекции, т.е. если вставить 2 контрола, второй работает. Почему viewstate срабатывает для всех элементов, кроме 0-го?
15 май 09, 18:39    [7187169]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
k_serg1983
Member

Откуда:
Сообщений: 13
up
18 май 09, 19:43    [7195332]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
Denis_Ivchenko
GDN Member

Откуда: GotDotNet.Ru
Сообщений: N/A
> Кроме того, в коллекции Controls панели изначально есть элемент LiteralControl, зачем он нужен?

Он ни за чем не нужен. Зделайте вместо:

<asp:Panel ID="pnlConfiguration" runat="server">
</asp:Panel>

вот так:

<asp:Panel ID="pnlConfiguration" runat="server" />

и его не будет.

И помоему тут лучше использовать PlaceHolder, а не Panel.


Данное сообщение получено с GotDotNet.Ru
18 май 09, 20:10    [7195389]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
Denis_Ivchenko
GDN Member

Откуда: GotDotNet.Ru
Сообщений: N/A
Добавляйте динамически контрол на Ините, а не Лоаде, и тогда все будет ОК.

Данное сообщение получено с GotDotNet.Ru
18 май 09, 20:20    [7195415]     Ответить | Цитировать Сообщить модератору
 Re: Интересный вопрос  [new]
k_serg1983
Member

Откуда:
Сообщений: 13
Denis_Ivchenko, спасибо, действительно помогло. Только есть так сказать небольшая странность:
вобщем работает когда:
- просто меняем "</asp:Panel>" на "/>" и не трогаем больше ничего.
- и если динамически добавлять Control в Page_Init, то работает и с "</asp:Panel>" и с "/>"

Сможете это как то прокоментировать, а то заработало - отлично, но понять в чем суть, причина....?
Заранее благодарен.
19 май 09, 16:12    [7199264]     Ответить | Цитировать Сообщить модератору
Все форумы / ASP.NET Ответить