Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / FindControl не находит динамически созданный контрол / 8 сообщений из 8, страница 1 из 1
16.12.2015, 13:59
    #39129754
Artprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindControl не находит динамически созданный контрол
Добрый день.

Есть ListView:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 <asp:ListView ID="lvOffers" runat="server" OnItemCommand="lvOffers_ItemCommand">
                <EmptyDataTemplate>
                    <tr>
                        <td colspan="11">У данного товара нет товарных предложений. Добавьте новое</td>
                    </tr>
                </EmptyDataTemplate>
                <ItemTemplate>
                    <tr>
                        <td>
                            <asp:Panel ID="p_prices" OnDataBinding="p_prices_DataBinding" runat="server" />                          
                        </td>
                    </tr>
                </ItemTemplate>
            </asp:ListView>


Во время баиндинга в Panel ID="p_prices" успешно создаются TextBox-ы, количество которых заранее не известно:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
protected void p_prices_DataBinding(object sender, EventArgs e)
        {
            var panel = (Panel)sender;
            var lvitem = panel.Parent;
            var labelOfferId = (Label)lvitem.FindControl("lOfferID");
            if (labelOfferId != null)
            {
                var offerId = int.Parse(labelOfferId.Text);
                foreach (var priceType in PriceTypeService.GetAllPriceTypes())
                {
                    var textBox = new TextBox()
                    {
                        ID = "price_" + priceType.InternalName,
                        Width = 80,
                        Text = OfferService.GetPriceForOfferRow(offerId, priceType.PriceTypeId).ToString(),
                        ToolTip = priceType.Name
                    };
                    panel.Controls.Add(textBox);
                }
            }
        }



Далее, при сохранении изменений, мне нужно получить значения этих TextBox-ов, но не удается найти Control-ы по ID:
Код: c#
1.
2.
3.
4.
5.
6.
7.
var pPrices = (Panel)lvItem.FindControl("p_prices");
                    foreach (var priceType in PriceTypeService.GetAllPriceTypes())
                    {                       
                        var tbPrice = (TextBox)pPrices.FindControl("price_" + priceType.InternalName);
                        if (tbPrice != null)
                            offerRow["price_" + priceType.InternalName] = tbPrice.Text.ToString().TryParseFloat();
                    }



Я так понимаю, что проблема в том, что на момент создания страницы TextBox-ов еще нет?
Как можно решить эту проблему?
...
Рейтинг: 0 / 0
16.12.2015, 14:10
    #39129782
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindControl не находит динамически созданный контрол
ArtprogЯ так понимаю, что проблема в том, что на момент создания страницы TextBox-ов еще нет?
Как можно решить эту проблему?
Вот именно. На событии страницы OnInit на каждом PostBack'e необходимо пересоздавать все динамические конторолы с их оригинальным ID. Тогда байндер будет их находить.
...
Рейтинг: 0 / 0
16.12.2015, 14:48
    #39129829
Artprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindControl не находит динамически созданный контрол
AxeleronArtprogЯ так понимаю, что проблема в том, что на момент создания страницы TextBox-ов еще нет?
Как можно решить эту проблему?
Вот именно. На событии страницы OnInit на каждом PostBack'e необходимо пересоздавать все динамические конторолы с их оригинальным ID. Тогда байндер будет их находить.

Если я пересоздам контрол - я ведь потеряю его значение..
...
Рейтинг: 0 / 0
16.12.2015, 14:50
    #39129832
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindControl не находит динамически созданный контрол
ArtprogЕсли я пересоздам контрол - я ведь потеряю его значение..
Нет, на ребайндинге оно придет обратно из ViewState (если не отключен) и по ID контрола встанет на свое положенное место.
...
Рейтинг: 0 / 0
16.12.2015, 15:10
    #39129856
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindControl не находит динамически созданный контрол
ТС посмотри жизненный цикл страницы, инициализация контрола идет раньше чем приписка ему данных. мутная тема. эт как ссать против ветра простите за аналогию.
...
Рейтинг: 0 / 0
16.12.2015, 15:23
    #39129867
Artprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindControl не находит динамически созданный контрол
Axeleron,

Так а во время Init у asp:ListView еще нет элементов
...
Рейтинг: 0 / 0
16.12.2015, 15:54
    #39129905
Axeleron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindControl не находит динамически созданный контрол
...
Рейтинг: 0 / 0
16.12.2015, 19:39
    #39130167
Artprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindControl не находит динамически созданный контрол
AxeleronArtprog,
Почитай тут ответ

Спасибо, все получилось!

Сделал так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
 public DataTable OfferRowsDt
        {
            set { Session["OfferRowsDt"] = value;  }
            get { return (DataTable)Session["OfferRowsDt"]; }
        }

 protected void Page_Init(object sender, EventArgs e)
        {
            
            if (Page.IsPostBack)
            {                
                lvOffers.DataSource = OfferRowsDt;
                lvOffers.DataBind();
                foreach (var listItem in lvOffers.Items)
                {
                    var panel = listItem.FindControl("p_prices");
                    if (panel != null)
                    {
                        foreach (var priceType in PriceTypeService.GetAllPriceTypes())
                        {
                            var textBox = new TextBox()
                            {
                                ID = "price_" + priceType.InternalName,
                                Width = 80,
                                ToolTip = priceType.Name
                            };
                            panel.Controls.Add(textBox);
                        }
                    }
                }
            }
        }

protected void p_prices_DataBinding(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                var panel = (Panel)sender;
                var lvitem = panel.Parent;
                var labelOfferId = (Label)lvitem.FindControl("lOfferID");
                if (labelOfferId != null)
                {
                    var offerId = int.Parse(labelOfferId.Text);
                    foreach (var priceType in PriceTypeService.GetAllPriceTypes())
                    {
                        var textBox = (TextBox)panel.FindControl("price_" + priceType.InternalName);
                        if (textBox != null) textBox.Text = OfferService.GetPriceForOfferRow(offerId, priceType.PriceTypeId).ToString();
                        else
                        {
                            textBox = new TextBox()
                            {
                                ID = "price_" + priceType.InternalName,
                                Width = 80,
                                Text = OfferService.GetPriceForOfferRow(offerId, priceType.PriceTypeId).ToString(),
                                ToolTip = priceType.Name
                            };
                            panel.Controls.Add(textBox);
                        }
                    }
                }
            }
        }
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / FindControl не находит динамически созданный контрол / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]