2010-08-20 23 views
10

Después de la devolución de datos (haga clic en un botón) en mi formulario ASP.NET, todos los DataItem de mi formulario son nulos. ¿Por qué? ¿Qué debo hacer para recuperar el contenido de la lista de datos incluso después de la devolución?ASP.NET/DataItem de DataList es nulo después de Postback

protected void buttonAddRecord_Click(object sender, EventArgs e) 
    { 
     foreach (DataListItem item in listFields.Items) 
     { 
      // item.DataItem == null WTF? 
     } 
    } 

protected void Page_Load(object sender, EventArgs e) 
    { 
     BindFields(); 
    } 

private void BindFields() 
    { 
     object setting = MySettings.GetSetting(); 

     if (!Null.IsNull(setting)) 
     { 
      listFields.DataSource =  
       DataProvider.GetData(int.Parse(setting.ToString())); 
      listFields.DataBind(); 
     } 

     listFields.Visible = listFields.Items.Count > 0; 
     emptyMessage.Visible = listFields.Items.Count == 0; 
    } 

Respuesta

8

Encontré mi respuesta here.

Lo que John dijo, los elementos de la fuente de datos solo están disponibles cuando se vinculan datos. Ya no se puede acceder después de la carga inicial de .

Usted podría considerar la posibilidad de un objeto o una colección objeto que representa los datos en pantalla que actualice con la red , a continuación, persisten los cambios desde que a bases de datos.

Más precisamente, que utilizó un HiddenField para almacenar un ID a través de mensajes y solicitar datos de la base de datos en lugar de tratar de conseguir que forman la DataItem (que no puede ser utilizado fuera del evento de enlace de datos).

El control HiddenField se utiliza para almacenar un valor que necesita ser persistió a través de mensajes en el servidor.

+0

Bueno, no veo otra opción. Y está funcionando bastante bien hasta ahora. – asmo

+0

HiddenField funcionó para mí. Estoy usando un repetidor y necesito persistir los datos del enlace a los clics del botón. – Cordell

+0

Esto suena como una buena manera de hacer el doble de llamadas a la base de datos según sea necesario. Parece que DataList podría tener un modelo pobre. – NetMage

1

Compruebe si realmente DataBind() DataList después de cada devolución de datos. Normalmente obtienes DataList, GridView, DropDownList (y otros Controles) vacíos después de un Postback cuando no los vuelvas a vincular.

+1

Gracias por la pista, pero realmente vuelvo a vincular la DataList incluso en la devolución de datos. También verifiqué el depurador y el DataSource queda vinculado a la devolución de datos. – asmo

7

DataItem solo está disponible cuando se trata de enlace de datos.

Load viene antes de Click por lo que está sobrescribiendo sus datos de todos modos.

hacer esto:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     BindFields(); 
    } 
} 

se debe utilizar una fuente de datos (como ObjectDataSource) para manejar y actualizar DataBinding/Insertar.

actualización/consejo:

El uso de marcadores de posición para enlazar datos a que está recibiendo en problemas. Debería considerar usar ListView, GridView, DataList o Repeater. Estoy seguro de que cualquiera de ellos hará lo que quiera y tendrá que programar menos. Use su tiempo para aprender en lugar de tratar de hacer que esto funcione, está condenado al fracaso.

+0

Ya estoy usando una DataList (mira el título). Y estoy obligado a usar PlaceHolder ya que no puedo saber de antemano cuál será el tipo de control de cada campo. En realidad, cada DataListItem de mi DataList contiene un control PlaceHolder cuyo tipo se determinará en el enlace de datos. – asmo

+0

Entonces, ¿qué estás poniendo en esos marcadores de posición? – Jeroen

+0

Cada marcador de posición contiene un control, como TextBox, CheckBox, RadioButtonList, DropDownList, etc. No puedo saber el tipo de control exacto desde su dinámica. Cada marcador de posición representa un campo en una forma, por ejemplo, Nombre, Dirección, Correo electrónico, Comida favorita, etc. – asmo

Cuestiones relacionadas