Выпадающий список в репитере, выбранный индекс изменен, не работает - PullRequest
2 голосов
/ 19 мая 2011

У меня есть повторитель с выпадающим списком. Когда пользователь меняет свой индекс, я бы хотел, чтобы метка изменила его значение. (значения ddlSizes взяты из БД MySQL)

Sizes.aspx

<asp:DropDownList ID="ddlSizes" runat="server" AutoPostBack="True" DataSourceID="objdsSizes"  DataTextField="SizeName" DataValueField="SizeID" />

<asp:Label ID="lbldummy" runat="server" Text=""></asp:Label>

Sizes.aspx.vb

Protected Sub ddlSizes_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlSizes.SelectedIndexChanged
    lbldummy = ddlSizes.value
End Sub

Но ddlSizes.SelectedIndexChanged не распознается. Таким образом, значение lbldummy не изменится.

Есть предложения? Спасибо.

Ответы [ 3 ]

7 голосов
/ 22 мая 2011

Вы захотите создать обработчик для DropDownList, в этом вам необходим код, который преобразует отправителя в DropDownList, затем получает родительский элемент управления и преобразует его в RepeaterItem. Из этого вы можете ссылаться на любые другие элементы управления в RepeaterItem

Public Sub ddlSizes_SelectedIndexChanged(sender As Object, e As EventArgs)
    Dim ddlSizes As DropDownList = DirectCast(sender, DropDownList)
    Dim ri As RepeaterItem = DirectCast(ddlSizes.Parent, RepeaterItem)
    Dim lbldummy As Label = DirectCast(ri.FindControl("lbldummy"), Label)
    lbldummy.Text = ddlSizes.SelectedValue
End Sub

Затем в свой ddlSizes DropDownList добавьте OnSelectedIndexChanged="ddlSizes_SelectedIndexChanged" и убедитесь, что для него установлено AutoPostBack = "True"

1 голос
/ 19 мая 2011

Вот пример (C #, но его легко адаптировать к VB.NET). Обратите внимание, как внутри DdlSizes_SelectedIndexChanged я использую FindControl, чтобы найти соответствующую метку:

<%@ Page Language="C#" %>
<script type="text/c#" runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            rep.DataSource = Enumerable.Range(1, 5);
            rep.DataBind();
        }
    }

    protected void DdlSizes_SelectedIndexChanged(object sender, EventArgs e)
    {
        var ddl = (DropDownList)sender;
        var lbl = (Label)ddl.FindControl("lbldummy");
        lbl.Text = ddl.SelectedValue;
    }
</script>
<!DOCTYPE html>
<html>
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="Form1" runat="server">
        <asp:Repeater ID="rep" runat="server">
            <ItemTemplate>
                <asp:DropDownList ID="ddlSizes" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DdlSizes_SelectedIndexChanged">
                    <asp:ListItem Value="1" Text="item 1" />
                    <asp:ListItem Value="2" Text="item 2" />
                    <asp:ListItem Value="3" Text="item 3" />
                </asp:DropDownList>
                <asp:Label ID="lbldummy" runat="server" />
            </ItemTemplate>
        </asp:Repeater>
    </form>
</body>
</html>
1 голос
/ 19 мая 2011

Текст, вероятно, является свойством по умолчанию, но я бы все же указал его:

lbldummy.Text = ddlSizes.value

но для этого вам действительно не нужно делать постбэк, вы можете сделать это и через Javascript. делать что-то вроде этого:

<asp:DropDownList ID="ddlSizes" runat="server" onchange="return ddlSizes_change(this);" DataSourceID="objdsSizes"  DataTextField="SizeName" DataValueField="SizeID" />


function ddlSizes_change(dropdown)
{
     document.getElementById('<%= lbldummy.ClientID %>').innerHTML = 
         dropdown.options[myindex].value

    return true;
}
...