Как связать повторитель ItemDataBound, чтобы обновить в выпадающем списке SelectedIndexChanged

Я новичок на ASP.Net и застрял на некоторое время.

Каждый раз, когда меняется индекс моего выпадающего меню, я хочу заполнить свой ретранслятор объектами.

Это работает нормально, но когда я выбираю в моем раскрывающемся списке значение, которое не содержит каких-либо объектов, старые объекты из последнего вызова все еще там, я хочу, чтобы они исчезли.

Я попытался очистить элементы от повторителя, используя Datasource = null, а затем снова выполнить привязку данных, но это не помогло.

Я думаю, что это произошло с событием ItemDataBound на моем повторителе. ItemDatabound не вызывается, когда я выбираю в выпадающем списке значение, которое не содержит каких-либо объектов.

ItemDataBound CODE:

protected void rptStudentQuestion_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Label lblAnswer = e.Item.FindControl("lblAnswer") as Label;
        TextBox tbxAnswer = e.Item.FindControl("tbxAnswer") as TextBox;
        Button btnSend = e.Item.FindControl("btnSend") as Button;
        if (lblAnswer.Text == "" || lblAnswer == null)
        {
            lblAnswer.Visible = false;
            lblAnswer.Enabled = false;
            tbxAnswer.Visible = true;
            tbxAnswer.Enabled = true;
            btnSend.Enabled = true;
            btnSend.Visible = true;
        }
        else
        {
            lblAnswer.Visible = true;
            lblAnswer.Enabled = true;
            tbxAnswer.Visible = false;
            tbxAnswer.Enabled = false;
            btnSend.Enabled = false;
            btnSend.Visible = false;

        }
    }
}

OnSelectedIndexChanged CODE:

protected void DrpdwnLectureName_SelectedIndexChanged(object sender, EventArgs e)
{
    string SelectedLecture = DrpdwnLectureName.SelectedValue;
    string user = Server.HtmlEncode(Context.User.Identity.Name).ToString();
    using (var client = new WCFReference.SRSServiceClient())
    {
        var LectureList = client.GetTeacherLecture(user);
        foreach (var item in LectureList)
        {
            if (item.LectureName == DrpdwnLectureName.SelectedValue)
            {
                var list = client.GetStudentQuestions(item.LectureID, user);
                rptStudentQuestion.DataSource = list;
                rptStudentQuestion.DataBind();
            }
        }               

    }

}

Код разметки:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:DropDownList ID="DrpdwnLectureName" AutoPostBack="True" runat="server" OnSelectedIndexChanged="DrpdwnLectureName_SelectedIndexChanged"></asp:DropDownList>
            <asp:Panel ID="PrintPanel" runat="server">
                <asp:Label ID="Label1" runat="server" Text="Gör en .pdf på besvarade frågor"></asp:Label>
                <asp:Button ID="btnDoPdf" runat="server" Text="Button" OnClick="btnDoPdf_Click" />
            </asp:Panel>
            <asp:Repeater ID="rptStudentQuestion" runat="server" OnItemCommand="rptStudentQuestion_ItemCommand" OnItemDataBound="rptStudentQuestion_ItemDataBound">
                <ItemTemplate>
                    <asp:Label ID="lblQuestion" runat="server" Text='<%# Eval("StudentQuestionQuestion") %>'></asp:Label>
                    <br />
                    <asp:TextBox ID="tbxAnswer" runat="server" Visible="false"></asp:TextBox>
                    <asp:Button ID="btnSend" CommandName="SendAnswer" runat="server" Text="Skicka svar" CommandArgument='<%# Eval("StudentQuestionID") %>' />
                    <br />
                    <asp:Label ID="lblAnswer" runat="server" Text='<%# Eval("StudentQuestionAnswer") %>' Visible="false"></asp:Label>
                    <br />
                </ItemTemplate>
            </asp:Repeater>
        </ContentTemplate>
    </asp:UpdatePanel>

Обновлен код по запросу (фрагмент из DrpdwnLectureName_SelectedIndexChanged)

if (item.LectureName == DrpdwnLectureName.SelectedValue)
{
    var list = client.GetStudentQuestions(item.LectureID, user);
    if (list.Count() > 0)
    {
        rptStudentQuestion.Visible = true;
        rptStudentQuestion.DataSource = list;
        rptStudentQuestion.DataBind();
    }
    else
    {
        rptStudentQuestion.Visible = false; // In debug it preforms this, but nothing happens.                            
    }
}

1 ответ

Решение

Это не решение, но может решить проблему обновления панели обновления. Вы можете контролировать обновление панели обновления вручную, выполнив это:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
        <ContentTemplate>
            <asp:DropDownList ID="DrpdwnLectureName" AutoPostBack="True" runat="server" OnSelectedIndexChanged="DrpdwnLectureName_SelectedIndexChanged"></asp:DropDownList>
            <asp:Panel ID="PrintPanel" runat="server">
                <asp:Label ID="Label1" runat="server" Text="Gör en .pdf på besvarade frågor"></asp:Label>
                <asp:Button ID="btnDoPdf" runat="server" Text="Button" OnClick="btnDoPdf_Click" />
            </asp:Panel>
            <asp:Repeater ID="rptStudentQuestion" runat="server" OnItemCommand="rptStudentQuestion_ItemCommand" OnItemDataBound="rptStudentQuestion_ItemDataBound">
                <ItemTemplate>
                    <asp:Label ID="lblQuestion" runat="server" Text='<%# Eval("StudentQuestionQuestion") %>'></asp:Label>
                    <br />
                    <asp:TextBox ID="tbxAnswer" runat="server" Visible="false"></asp:TextBox>
                    <asp:Button ID="btnSend" CommandName="SendAnswer" runat="server" Text="Skicka svar" CommandArgument='<%# Eval("StudentQuestionID") %>' />
                    <br />
                    <asp:Label ID="lblAnswer" runat="server" Text='<%# Eval("StudentQuestionAnswer") %>' Visible="false"></asp:Label>
                    <br />
                </ItemTemplate>
            </asp:Repeater>
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="DrpdwnLectureName" />
        </Triggers>
    </asp:UpdatePanel>

и когда вы хотите обновить панель в коде, вы вызываете: "UpdatePanel1.Update()"

if (item.LectureName == DrpdwnLectureName.SelectedValue)
{
    var list = client.GetStudentQuestions(item.LectureID, user);
    if (list.Count() > 0)
    {
        rptStudentQuestion.Visible = true;
        rptStudentQuestion.DataSource = list;
        rptStudentQuestion.DataBind();
    }
    else
    {
        rptStudentQuestion.Visible = false; // In debug it preforms this, but nothing happens.     
        UpdatePanel1.Update() //This 'force' updatepanel updating        
    }
}
Другие вопросы по тегам