Динамическое добавление пользовательского элемента управления на страницу оставляет элементы управления внутри UC равными нулю.

Другие ответы здесь верны: is используется для сравнения identity , а == используется для сравнения равенство . Поскольку вам нужно заботиться о равенстве (две строки должны содержать одни и те же символы), в этом случае оператор is просто ошибочен, и вы должны использовать вместо него ==.

Причина is работает интерактивно, что (большинство) строковых литералов по умолчанию interned . Из Wikipedia:

Интернированные строки ускоряют сопоставления строк, которые иногда являются узким местом производительности в приложениях (например, компиляторами и языками динамического программирования), которые в значительной степени зависят от хэш-таблиц со строковыми ключами. Без интернирования проверка того, что две разные строки равны, включает в себя изучение каждого символа обеих строк. Это медленно по нескольким причинам: по своей сути это O (n) в длине строк; обычно требуется чтение из нескольких областей памяти, которые требуют времени; и чтение считывает кеш процессора, что означает, что для других нужд меньше кеша. С интернированными строками после первоначальной статической операции достаточно простого теста на идентификацию объекта; это обычно реализуется как тест равенства указателя, обычно это всего лишь одна машинная команда без ссылки на память.

Итак, когда у вас есть два строковых литерала (слова, которые буквально введены в ваш исходный код программы, окруженный кавычками) в вашей программе, имеющей то же значение, компилятор Python автоматически ставит строки, делая их оба сохраненными в том же месте памяти. (Обратите внимание, что это не всегда всегда , а правила для того, когда это происходит, довольно запутаны, поэтому, пожалуйста, не полагайтесь на это поведение в производственном коде!) [/ ​​G12]

Поскольку в вашем интерактивном сеансе обе строки фактически хранятся в одном и том же месте памяти, у них одинаковое identity , поэтому оператор is работает так, как ожидалось. Но если вы построите строку другим способом (даже если эта строка содержит точно одинаковые символы), то строка может быть равна , но это не одна и та же строка , то есть она имеет другое тождество , поскольку оно хранится в другом месте в памяти.

1
задан user1937093 15 January 2019 в 21:07
поделиться

2 ответа

Вероятно, вам не понравится этот ответ, но перегрузка для Page.LoadControl, которая позволяет указывать тип элемента управления и добавление аргументов конструктора, не привязывает ascx к выделенному коду и всем связанным дочерним элементам управления. в конечном итоге будет нулевым.

В прошлом я работал над этим, добавляя еще один метод для установки зависимостей после создания пользовательского элемента управления, но это не идеальное решение.

Это сказало, что ты не делаешь ничего плохого. Привязка будет работать правильно, если вы используете Page.LoadControl("~/path/to/mycontrol.ascx"), но у вас не будет инжектора конструктора.

Я полагаю , что проблема заключается в том факте, что базовый класс на самом деле не имеет отношения с интерфейсной страницей, кроме как через директиву page, которая определяет его как класс code-behind. Ничто не останавливает несколько разных внешних интерфейсов, использующих один и тот же класс, как его код-сзади, поэтому загрузка с помощью Type делает либо очень трудным, либо полным невозможным определить, каким будет правильное ascx связывание.

0
ответ дан Jonathon Chase 15 January 2019 в 21:07
поделиться

Прежде всего, вам не нужно быть в Page_Init для работы с динамическими элементами управления. Page_Load просто отлично. Но для заполнения Repeater вы можете создать свойство в UserControl

public partial class WebUserControl1 : System.Web.UI.UserControl
{
    public Repeater _ARepeater
    {
        get
        {
            return ARepeater;
        }
        set
        {
            ARepeater = value;
        }
    }


    protected void Page_Load(object sender, EventArgs e)
    {
    }

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

protected void Page_Load(object sender, EventArgs e)
{
    var list = (WebUserControl1)LoadControl("~/WebUserControl1.ascx");
    list.ID = "MyUserControl";
    Panel1.Controls.Add(list);

    list._ARepeater.DataSource = source;
    list._ARepeater.DataBind();
}

Или используйте FindControl

var _ARepeater = (Repeater)Panel1.FindControl("MyUserControl").FindControl("ARepeater");
_ARepeater.DataSource = dt;
_ARepeater.DataBind();
0
ответ дан VDWWD 15 January 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: