ASP.NET/DataItem de DataList es nulo después de Postback
null (3)
Después de la devolución (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?
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;
}
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.
Encontré mi respuesta aquí .
Lo que dijo John, los elementos de la fuente de datos solo están disponibles cuando se enlazan datos. Ya no son accesibles después de la carga inicial.
Puede considerar la posibilidad de tener un objeto o una colección de objetos que represente los datos en pantalla que actualice con la cuadrícula, y luego cambiar los cambios de eso a las bases de datos.
Más precisamente, utilicé un HiddenField para almacenar una identificación en las publicaciones y solicité datos de la base de datos en lugar de tratar de obtenerlo del DataItem (que no puede usarse fuera del evento de enlace de datos).
El control HiddenField se utiliza para almacenar un valor que debe conservarse en todas las publicaciones del servidor.
DataItem
solo está disponible cuando se DataItem
datos.
Load
viene antes de hacer Click
para que esté sobrescribiendo sus datos de todos modos.
Hacer esto:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindFields();
}
}
Debería usar un DataSource (como ObjectDataSource) para manejar DataBinding y Update / Insert.
Actualizar / aconsejar:
El uso de PlaceHolders para enlazar datos te está metiendo 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.