Frage

ich bevölkere Webformular mit dynamischer Liste von Prüfungen aus der Datenbank. Ich möchte Benutzer Prüfungsnoten für jede Prüfung geben. Es gibt Liste der Prüfung Titels und Textbox in der Nähe von jedem Titel.

I erstellen Liste mit Repeater-Steuerelement (Viewstate ist deaktiviert):

<asp:Repeater ID="rptExams" runat="server" onitemdatabound="rptExams_ItemDataBound" >    
        <ItemTemplate>        
                <tr>
                    <td>                        
                        <asp:Literal runat="server" ID="ltTitle"/>
                    </td>
                    <td>
                        <asp:HiddenField runat="server" ID="hfId"/>
                        <asp:Textbox runat="server" ID="tbMark"/>
                    </td>
                </tr>
        </ItemTemplate>    
    </asp:Repeater>

Und binden Daten-Repeater auf Page_Init:

class Exam
{
    public int Id { get; set;}
    public string Title { get; set;}
}
...
// this list is retrieved from database actually 
Exam[] Exams = new Exam[]
{
    new Exam { Id = 1, Title = "Math"},
    new Exam { Id = 2, Title = "History"}                                        
};
...
protected void Page_Init(object sender, EventArgs e)
{
    rptExams.DataSource = Exams;
    rptExams.DataBind();
}

So weit, so gut. Dann muss ich auf Postbacks Daten abzurufen. Ich habe zwei Möglichkeiten, aber beide sieht hässlich aus. Idee ist, dynamisch erzeugt databounded Steuerelemente auf ItemDataBoundEvent in Page_Init Stufe zu speichern, und deren Werte in Page_Load Stufe verarbeiten. Es sieht wie folgt aus:

private Dictionary<HiddenField, TextBox> Id2Mark = new Dictionary<HiddenField, TextBox>();

protected void rptExams_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    ...
    if (IsPostBack)
    {
        var tbMark = (TextBox)e.Item.FindControl("tbMark");
        var hfId = (HiddenField)e.Item.FindControl("hfId");

        // store dynamically created controls 
        Id2Mark.Add(hfId, tbMark);
    } 
    ...    
}

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        foreach (var pair in Id2Mark)
        {
            int examId = Int32.Parse(pair.Key.Value);
            string mark = pair.Value.Text;
            // PROCESS 
        }
...

Ich bin ganz sicher, dass es eine bessere Möglichkeit, Daten von dynamisch erstellten Steuerelemente abzurufen. Vielen Dank im Voraus!

War es hilfreich?

Lösung

Hier ist, wie Sie es tun können:

Zuerst geht rebind die Daten nicht auf Postbacks - es ist nicht notwendig. Nur binden Sie es auf den ersten Aufruf der Seite.

protected void Page_Init(object sender, EventArgs e)
{
    if (!IsPostBack){
        rptExams.DataSource = Exams;
        rptExams.DataBind();
    }
}

Sie brauchen nicht das Wörterbuch nicht.

Dann auf einem Postbacks, können Sie an die gebundenen Daten erhalten, wie folgt:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        foreach (RepeaterItem item in rptExams.Items)
        {
            HiddenField hfId = item.FindControl("hfId") as HiddenField;
            TextBox tbMark = item.FindControl("tbMark") as TextBox;

            int examId = Int32.Parse(hfId);
            string mark = tbMark.Text;
            // PROCESS 
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top