Я предпочитаю привязывать свои серверные элементы управления в моем коде позади. Я могу отладить и проверить это лучше. Мне также не нужно делать другие сумасшедшие вещи, чтобы добраться до моих связанных данных из кода ... он уже там. Вот пример.
Предположим, что следующий хранимый процесс в SQL:
CREATE PROCEDURE selEmployees
@DeptId int,
@SearchString varchar(100)
AS
BEGIN
SELECT TOP 1000 * FROM Employees
WHERE DeptId = @DeptId AND CONTAINS(*, SearchString);
END
Я могу сопоставить этот хранимый процесс с методом в моем классе сущности или кодом страницы, например:
public static DataSet selEmployees(int DeptId, string SearchString)
{
DataSet ds = new DataSet();
SqlConnection con = new SqlConnection(clsData.getConnString());
SqlCommand cmd = new SqlCommand("selEmployees", con); // stored proc name
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter _DeptId = cmd.Parameters.Add("@DeptId", SqlDbType.Int); //stored proc parameter name and datatype
_DeptId.Value = DeptId; //assign method parameter value to sql parameter
SqlParameter _SearchString = cmd.Parameters.Add("@SearchString", SqlDbType.Int); //stored proc parameter name and datatype
_SearchString.Value = SearchString; //assign method parameter value to sql parameter
SqlDataAdapter adapt = new SqlDataAdapter(cmd);
adapt.SelectCommand = cmd;
con.Open();
try
{
adapt.Fill(ds);
}
catch (Exception ex)
{
string msg = ex.ToString();
}
finally
{
con.Close();
con.Dispose();
}
return ds;
}
Затем я могу просто привязать свои данные к своему серверному элементу управления на page_load следующим образом:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GridView1.DataSource = Employees.selEmployees(MyDeptId, MySearchString);
GridView1.DataBind();
}
}
Если вы попробуете это, обязательно удалите параметр DataSourceId из GridView в вашей разметке. DataSource и DataSourceId не очень хорошо играют вместе.
Примечание: на самом деле есть миллион лучших способов сделать это. Целью этого поста было проиллюстрировать одну простую альтернативу использованию SqlDataSource в разметке.
Один из способов продвинуться дальше - назначить результирующий набор данных для многократно используемой переменной, такой как свойство страницы:
public partial class ViewEmployees : System.Web.UI.Page
{
public DataSet DataSetEmployees { get; set; } //re-usable property gets set at page_load
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//save the dataset to a re-usable property
DataSetEmployees = Employees.selEmployees(MyDeptId, MySearchString);
//bind using the property
GridView1.DataSource = DataSetEmployees;
GridView1.DataBind();
}
}
}
С этим простым обновлением у вас есть возможность использовать и повторно использовать DataSet по всей странице без необходимости повторного запроса к базе данных.