Почему необходим метод DataBind()?
Простой вопрос, я думаю.
В течение долгого времени я слепо следил за (предположительно) общим шаблоном, когда программно привязывал свои элементы управления ASP.NET. А именно:
gridView1.DataSource = someList;
gridView1.DataBind();
Однако, если я установил привязку GridView к элементу управления DataSource с помощью свойства DataSourceID, вызов DataBind() не нужен. А именно:
gridView1.DataSourceID = LinqDataSource1;
.
Кроме того, если вы попытаетесь установить свойство DataSource в разметке ASPX, вас встретит следующее:
Вы не можете установить свойство DataSource декларативно.
Я предполагаю, что они связаны друг с другом, но я все еще не понимаю, почему DataBind() необходим. Разница между DataSource и DataSourceID вторична - я могу понять, какая там магия. Реальный вопрос: Почему не настраивает собственный источник данных DataSource? Есть ли какие-либо сценарии, в которых мы хотим установить DataSource, но не привязываться к нему?
Ответы
Ответ 1
В ASP.Net часто важно иметь определенные данные и готово в определенных точках жизненного цикла страницы, а не раньше. Например, вам может потребоваться скопировать в раскрывающийся список раньше, чтобы позже установить выбранный индекс в этом списке. Или вы можете немного подождать, чтобы связать эту большую сетку, чтобы уменьшить время, в течение которого вы держите это соединение активным/сохраняете данные в памяти.
Если вы явно вызываете метод .DataBind()
, это позволяет поддерживать сценарии на обоих концах спектра.
Ответ 2
DataSource является свойством класса BaseDataBoundControl. DataSourceID является свойством класса DataBoundControl, который наследуется от BaseDataBoundControl и не существовал до ASP.NET 2.0.
Так как DataBoundControl явно предназначен для отображения данных в виде списка или табличной формы, а BaseDataBoundControl не может сделать это предположение, привязка не является автоматическим при установке DataSource, поскольку тип элемента управления может не соответствовать структуре данных.
Конечно, это всего лишь предположение, основанное на документации MSDN, поэтому я могу ошибаться.
Ответ 3
Я заметил, что без использования DataBind() ничего не будет отображаться в моем GridView, поэтому я всегда включаю его, как показано в этом разделе кода:
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
Пожалуйста, простите дополнительный комментарий, поскольку я также все еще изучаю ASP.Net, а комментарии помогут мне лучше узнать "что и почему" использовать определенные утверждения.
Ответ 4
Попробуйте следующее:
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");
}
}