2009-06-11 20 views
16

Pregunta simple, supongo.¿Por qué es necesario el método DataBind()?

Durante mucho tiempo he seguido ciegamente un patrón (supuestamente) común cuando programáticamente los datos de mis controles ASP.NET. A saber:

gridView1.DataSource = someList; 
gridView1.DataBind(); 

Sin embargo, si estuviera ajustando el GridView para unirse a un control de origen de datos través de la propiedad DataSourceID, la llamada a DataBind() es innecesario. A saber:

gridView1.DataSourceID = LinqDataSource1; 

es suficiente.

Por otra parte, si se intenta establecer la propiedad DataSource en ASPX marcado, que son recibidos con lo siguiente:

No se puede establecer la propiedad DataSource de forma declarativa.

Supongo que estos están relacionados, pero todavía estoy perplejo sobre por qué DataBind() es necesario. La diferencia entre DataSource y DataSourceID es secundaria: puedo entender algo de magia que tiene lugar allí. La verdadera pregunta es ¿por qué el organizador de orígenes DataSource no causa la unión de datos automáticamente? ¿Hay algún escenario en el que deseemos establecer el DataSource pero sin vincularlo?

Respuesta

16

En ASP.Net, a menudo es importante tener ciertos datos disponibles y listos en ciertos momentos del ciclo de vida de la página, y no antes. Por ejemplo, es posible que deba vincularse a una lista desplegable temprano para permitir establecer el índice seleccionado en esa lista más adelante. O quizás desee esperar un poco para enlazar esa grilla grande para reducir la cantidad de tiempo que mantiene activa esa conexión/mantener los datos en la memoria.

Tener que llamar explícitamente al método .DataBind() hace posible admitir escenarios en ambos extremos del espectro.

+2

¿Puede explicar cómo unión hace que tarde un tiempo más corto para mantener los datos en la memoria?Supongo que para una simple Colección guardada en la memoria (como arriba, si someList es List ) no hay diferencia, pero ¿cómo funciona para algo más complicado? ¿Hay una evaluación demorada? Un ejemplo sería excelente. – JoshJordan

+0

Piense en usar un lector de datos como fuente. Si se vincula de inmediato, iterará sobre el lector y tendrá esos contenidos en la memoria. Si esperas más adelante en el ciclo de vida de la página, te aferras a él por menos tiempo. –

+1

Gracias por la explicación, sin embargo, no entiendo cómo 'esto reduce la cantidad de tiempo que mantiene activa esa conexión'. La conexión está abierta solo cuando se llama a ExecuteSelect() desde el evento OnDataBinding. Cuando ExecuteSelect() termina, llama a 'dbConnection.Close();' y la conexión ya no está activa. ¿Me estoy perdiendo de algo? – BornToCode

2

DataSource es una propiedad de la clase BaseDataBoundControl. DataSourceID es una propiedad de la clase DataBoundControl, que hereda de BaseDataBoundControl y no existía antes de ASP.NET 2.0. Dado que DataBoundControl explícitamente muestra datos en una lista o forma tabular, y BaseDataBoundControl no puede hacer esa suposición, el enlace no es automático cuando se establece DataSource porque el tipo de control puede no coincidir con la estructura de los datos.

Por supuesto, esto es solo una suposición basada en la documentación de MSDN, así que podría estar equivocado.

0

me di cuenta de que sin el uso de DataBind() que no se mostrará nada en mi GridView así que siempre incluyo como se muestra en esta sección del código:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    ' TableAdapter object. 
    ' Provide communication between this application and the database. 
    '----------------------------------------------------------------- 
    Dim suppliersAdapter As New SuppliersTableAdapter 

    ' Get the data from the TableAdapter into the GridView. 
    '------------------------------------------------------ 
    GridView1.DataSource = suppliersAdapter.GetSuppliers() 

    ' Display the result set from the TableAdapter in the GridView. 
    '-------------------------------------------------------------- 
    GridView1.DataBind() 
End Sub 

Por favor, perdona el extra comentar que a mí también sigo aprendiendo ASP.Net también y los comentarios me ayudarán a aprender mejor "qué y por qué" usar ciertas afirmaciones.

0

Prueba esto:

if (GridView1.EditIndex == e.Row.RowIndex) 
{    
    TextBox t2 = (TextBox)e.Row.FindControl("TextBox2"); 
    DateTime dt2; 
    if (DateTime.TryParse(t2.Text, out dt2)) 
    { 
     t2.Text = dt2.ToString("yyyy-MM-dd"); 
    } 
} 
Cuestiones relacionadas