Привязка GridView к SqlDataSource программно - PullRequest
1 голос
/ 20 января 2012

Я пытаюсь скопировать привязку в моей разметке с чем-то программным. Кажется, я вынужден использовать набор данных для привязки, а не SqlDataSource, как показано в моей разметке. Кроме того, при использовании набора данных я внезапно теряю разбиение на страницы, сортировку и т. Д. И получаю ошибки, которые мне необходимо обработать вручную. Они были обработаны автоматически раньше

Так вот моя разметка:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="True" 
    CellPadding="4" DataSourceID="SqlDataSource1" ForeColor="#333333" 
    GridLines="None" AllowPaging="True" AllowSorting="True" Width="520px">
    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
    <Columns>
    </Columns>
</asp:GridView>   
<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>" 
    SelectCommand="CustOrdersOrders" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:Parameter Direction="ReturnValue" Name="RETURN_VALUE" Type="Int32" />
        <asp:ControlParameter ControlID="txtCustId" DefaultValue="AROUT" 
            Name="CustomerID" PropertyName="Text" Type="String" />
    </SelectParameters>
</asp:SqlDataSource>

Я заменил его на что-то вроде этого:

SqlDataAdapter adapter = new SqlDataAdapter();                
conn.Open();
using (SqlConnection conn = new SqlConnection(connStr))
{
    SqlDataAdapter adapter = new SqlDataAdapter();

    conn.Open();

    using (SqlCommand cmd = new SqlCommand("CustOrdersOrders", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("CustomerID", "AROUT");
        cmd.ExecuteScalar();
        adapter.SelectCommand = cmd;
    }

    GridView1.DataSource = adapter;                
    GridView1.DataBind();
}

Это, конечно, приводит к ошибке, что источник данных имеет неправильный тип, но это именно то, что делает разметка. Единственное, о чем я могу думать, это то, что он использует DataSource вместо DataSourceID . Итак, как мне реплицировать эту разметку и получать всю сортировку и подкачку автоматически? Если мне нужно использовать набор данных, почему разметка не требует его? Но даже с набором данных он, кажется, не обрабатывает подкачку и сортировку автоматически, как я сказал.

Спасибо! Леви

1 Ответ

2 голосов
/ 20 января 2012

Нельзя установить DataAdapter в качестве значения свойства DataSource.SqlDataAdapter обеспечивает связь между набором данных и базой данных SQL.Вы должны использовать адаптер данных для заполнения DataTable / DataSet и использовать его в качестве источника данных.

В вашем коде возникли другие проблемы

1) Вы пытаетесь открыть соединение перед его объявлением.

2) Sql Объект адаптера данных создается дважды с одним и тем же именем.

Код ниже будет работать

using (SqlConnection conn = new SqlConnection(connStr))
{
    SqlDataAdapter adapter = new SqlDataAdapter();    
    conn.Open();
    DataTable dt = new DataTable();
    using (SqlCommand cmd = new SqlCommand("CustOrdersOrders", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("CustomerID", "AROUT");           
        adapter.SelectCommand = cmd;
        adapter.Fill(dt);
    }

    GridView1.DataSource = dt;                
    GridView1.DataBind();
}

http://www.dotnetperls.com/sqldataadapter

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx

...