Динамическое добавленное значение элемента управления текстового поля не обновляется

У меня есть заполнитель на странице, которая заполнена динамической таблицей с динамически добавленными текстовыми полями (которая заполнена данными, зависящими от языка). Заполнитель заполнен данными на каждом page.load, но разными данными, в зависимости от того, какой язык используется. При начальной загрузке устанавливается английский, который работает, но когда пользователь переходит на французский язык, данные в текстовых полях не изменяются с английского на французский. Но когда я отлаживаю, я вижу, что французский язык добавляется в каждое текстовое поле. Я пытался отключить viewstate на столе, но это не помогло. Я также использую PlaceHolder.Controls.Clear() перед тем, как снова добавить к нему элементы управления / данные. Ни один из них не работает, по-прежнему отображать исходные английские значения в каждом текстовом поле. Что может быть причиной этого?

    Protected Function FindTextBoxValues(ByRef ParentControl As Control, ByRef MyList As List(Of String)) As List(Of String)
    For Each ctrl As Control In ParentControl.Controls
        If TypeOf ctrl Is TextBox Then
            ' do something
            Dim CurrCtrl As New TextBox()
            CurrCtrl = CType(ctrl, TextBox)
            MyList.Add(CurrCtrl.Text)
        ElseIf ctrl.HasControls Then
            FindTextBoxes(ctrl, MyList)
        End If
    Next
End Function

1 ответ

Сделал небольшой пример.

Сначала добавьте заполнитель

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

Затем сделать выпадающий для языка. AutoPostBack в true

<asp:DropDownList ID="ddlLanguage" runat="server" OnSelectedIndexChanged="ddlLanguage_SelectedIndexChanged" AutoPostBack="true"> 
    <asp:ListItem Text="english" Value="english"></asp:ListItem>
    <asp:ListItem Text="french" Value="french"></asp:ListItem>
</asp:DropDownList>

В Page_Init

protected void Page_Init(object sender, EventArgs e)
{
    TextBox tb = new TextBox();
    tb.ID = "test1";
    if (!Page.IsPostBack)
    {
        tb.Text = "this is a English";
    }
    PlaceHolder1.Controls.Add(tb);
}

это событие срабатывает и находит элемент управления внутри заполнителя.

protected void ddlLanguage_SelectedIndexChanged(object sender, EventArgs e)
{
    TextBox ctrl = (TextBox)PlaceHolder1.FindControl("test1");
    DropDownList ddl = (DropDownList)sender;
    if (ddl.SelectedValue == "english")
    {
        ctrl.Text = "this is a English";
    }
    else if (ddl.SelectedValue == "french")
    {
        ctrl.Text = "this is a French";
    }
}

Протестировал сам, чтобы убедиться и все работает. Надеюсь, это поможет вам в дальнейшем.

Другие вопросы по тегам