2013-04-25 7 views
5

Ich bin ein Anfänger auf ASP.Net und wurde für eine Weile fest.Wie Repeater zu binden ItemDataBound, auf Dropdown-Liste zu aktualisieren SelectedIndexChanged

Jedes Mal, wenn sich der Index meines Dropdown-Menüs ändert, möchte ich meinen Repeater mit Objekten füllen.

Dies funktioniert gut, aber wenn ich einen Wert in meiner Dropdown-Liste, dass Dosent Objekte enthalten die alten Objekte aus dem letzten Aufruf ist immer noch da, ich will sie verschwinden.

Ich habe versucht, die Elemente aus dem Repeater mit Datenquelle = Null zu löschen und dann ein Databind erneut, aber das Dosent arbeiten.

Ich denke, es hat mit dem ItemDataBound-Ereignis auf meinem Repeater. Der ItemDatabound wird nicht aufgerufen, wenn ich in der Dropdown-Liste einen Wert wähle, der Dosent irgendwelche Objekte enthält.

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(); 
      } 
     }    

    } 

} 

Markup Code:

<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> 

-Code aktualisiert wie gewünscht (Snippet von 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.        
    } 
} 
+0

verstecken Sie Ihre Repeater, wenn u haben keine Wert in Dropdown-Liste –

+0

Ich habe nicht daran gedacht. Aber das funktioniert auch nicht. Vielleicht brauche ich ein Postback um "die Änderungen sichtbar zu machen"? –

+0

können Sie Ihren aktualisierten Code anzeigen –

Antwort

5

Dies ist keine Lösung, sondern kann Ihr Update-Panel Aktualisierung Problem lösen. Sie können Update steuern Update dies manuell tun:

<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> 

und wenn Sie das Panel in Code aktualisieren möchten, rufen Sie: "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   
    } 
}