LINQ-запрос к GridView, заполненный SqlDataSource - PullRequest
0 голосов
/ 11 февраля 2010

Мне нужно сделать запрос LINQ против 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 Ответ

1 голос
/ 13 февраля 2010

Я предпочитаю привязывать свои серверные элементы управления в моем коде позади. Я могу отладить и проверить это лучше. Мне также не нужно делать другие сумасшедшие вещи, чтобы добраться до моих связанных данных из кода ... он уже там. Вот пример.

Предположим, что следующий хранимый процесс в 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 по всей странице без необходимости повторного запроса к базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...