asp.net formularios web las mejores prácticas para recuperar los valores de control de servidor dinámico

StackOverflow https://stackoverflow.com/questions/2900327

  •  04-10-2019
  •  | 
  •  

Pregunta

Me rellenar formularios Web con la lista dinámica de los exámenes de la base de datos. Quiero usuario introducir notas de los exámenes para cada examen. Hay lista de títulos del examen y cuadro de texto cerca de cada título.

I Lista de control del repetidor Crear (ViewState está activada):

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

y se unen a los datos repetidor en 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();
}

Hasta aquí todo bien. Entonces tengo que recuperar datos de devolución de datos. Tengo dos maneras, pero dos de ellos se ve feo. Idea es almacenar los controles databounded creados de forma dinámica en ItemDataBoundEvent en la etapa Page_Init, y procesar sus valores en fase Load. Se ve así:

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

Estoy completamente seguro de que hay una mejor manera de recuperar los datos de los controles creados dinámicamente. ¡Gracias de antemano!

¿Fue útil?

Solución

Así es como puede hacerlo:

En primer lugar, no vuelva a enlazar los datos sobre la devolución de datos - no es necesario. Sólo se unen en la primera llamada de la página.

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

No necesitará ni el Diccionario.

A continuación, en una devolución de datos, se puede llegar a los datos ligados de la siguiente manera:

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 
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top