针对GridView的LINQ查询填充了SqlDataSource

时间:2010-02-11 12:08:41

标签: .net asp.net linq gridview

我需要针对填充LINQ的{​​{1}}进行GridView查询 - 从行创建字典。

所以我有:

SqlDataSource

<asp:GridView runat="server" ID="gridCurrency" DataSourceID="sourceCurrency" OnDataBound="gridCurrency_DataBound"
<asp:SqlDataSource runat="server" ID="sourceCurrency" ConnectionString="<%$ ConnectionStrings:MyConnStr %>" SelectCommand="[getCurrencies]" SelectCommandType="StoredProcedure" />

有没有比protected void gridCurrency_DataBound(object sender, EventArgs e) { var dic = (from row in ((DataView)sourceCurrency.Select(DataSourceSelectArguments.Empty)).Table.AsEnumerable() select new { ID = (byte)row["ID"], CurrencyName = (string)row["name"] }).ToDictionary(k => k.ID, k => k.CurrencyName); } DataTable更好的方法,而GridView没有GridView.DataSouce

1 个答案:

答案 0 :(得分:1)

我更喜欢在我的代码隐藏中绑定我的服务器控件。我可以更好地调试和测试它。我也不必做其他疯狂的事情来从代码隐藏中获取我的绑定数据......它已经存在了。这是一个例子。

在SQL中假设以下存储过程:

CREATE PROCEDURE selEmployees
@DeptId int,
@SearchString varchar(100)
AS
BEGIN
SELECT TOP 1000 * FROM Employees 
WHERE DeptId = @DeptId AND CONTAINS(*, SearchString);   
END

我可以将存储过的proc与我的实体类或页面代码隐藏中的方法匹配,如下所示:

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();
        }
    }

如果您尝试这样做,请务必从标记中的GridView中删除DataSourceId参数。 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,而无需重新查询数据库。