开发者

LINQ query against GridView filled with SqlDataSource

I need to make a LINQ query against GridView filled with SqlDataSource - to create a Dictionary from rows.

So I have:

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

and

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

Is there any better way then my to get a DataTab开发者_StackOverflowle from GridView while no GridView.DataSouce is present.


I prefer to bind my server controls in my code-behind. I can debug and test this better. I also don't have to do other crazy things to get to my bound data from code-behind... it's already there. Here's an example.

Assume the following stored proc in SQL:

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

I can match that stored proc to a method in my entity class or page code-behind, like this:

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

Then, I can just bind my data to my server control at page_load like this:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            GridView1.DataSource = Employees.selEmployees(MyDeptId, MySearchString);
            GridView1.DataBind();
        }
    }

If you try this, be sure to remove the DataSourceId parameter from the GridView in your mark-up. DataSource and DataSourceId don't play nice together.

Note: There are actually a million better ways to do this. The aim of this post was to illustrate one easy alternative to using SqlDataSource in your mark-up.

One way to take this a step futher is to assign the resultant dataset to a re-usable variable like a page property:

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

With that simple upgrade, you have the ability to use and re-use the DataSet throughout the page without having to re-query the database.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜