2014-09-09 2 views
1

У меня есть следующий код C#:Как читать все строки и заполнить GridView

using (SqlConnection connection = new SqlConnection(connString)) 
{ 
    //Get Parent Task 
    SqlCommand command = new SqlCommand(queryStringParent, connection); 
    connection.Open(); 

    SqlDataReader reader = command.ExecuteReader(); 
    if (!string.IsNullOrEmpty(fkobjectid) && fkobjectid != " ") 
    { 
     if (reader.HasRows) 
     { 
      gvParentTasks.DataSource = reader; 
      gvParentTasks.DataBind(); 
     } 
     while (reader.read()) 
     { 
     } 
    } 
} 

Если только заполнит GridView (gvParentTasks) с первой строкой. Как я могу использовать while (reader.read()) для чтения всех строк и заполнения GridView для всех строк?

ответ

2

Вы должны использовать SqlDataAdapter вместо и заполнить DataSet затем заселить GridView:

using (SqlConnection connection = new SqlConnection(connString)) 
{ 
    //Get Parent Task 
    SqlCommand command = new SqlCommand(queryStringParent, connection); 
    connection.Open(); 

    DataSet ds = new DataSet(); 
    SqlDataAdapter da = new SqlDataAdapter(command); 

    if (!string.IsNullOrEmpty(fkobjectid) && fkobjectid != " ") 
    { 
     da.Fill(ds); 

     gvParentTasks.DataSource = ds.Tables[0]; 
     gvParentTasks.DataBind(); 
    } 
} 
+0

Я отдам это. благодаря! – SearchForKnowledge

3

Вы на самом деле делает его более трудным, то вы должны сделать это. Вы можете создать страницу на своем интерфейсе. Все, что вам нужно сделать, это:

<asp:SqlDataSource 
    id="sdsOrderReview" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ECommerceDB %>" 
    ProviderName="System.Data.SqlClient" 
    SelectCommand="SELECT [OrderId], [AccountId], [Name] 
     FROM [Order] ORDER BY [OrderId] DESC"> 

</asp:SqlDataSource> 

Это простой пример, то для Grid View, все, что вам нужно сделать:

<asp:GridView id="gvOrder" runat="server" DataSourceId=sdsOrderReview"> 

Затем он автоматически заполнит вашу сетку с данными Ваш запрос. Плюс он будет существовать через все состояние страницы. Выполняя это через бэкэнд, вы должны будете убедиться, что он вызван в Page-Load, так как вы можете столкнуться с сохраняющимися проблемами.

+0

DataSource использует строку из CommandArgument, но это здорово. Я буду иметь в виду в следующий раз :) Спасибо – SearchForKnowledge

+1

@SearchForKnowledge Вы также можете передать CommandArguement через интерфейс. Который соединится с бэкэнд либо через Web-метод, либо с помощью Postback. – Greg

+0

Я узнал и поблагодарил вас. – SearchForKnowledge

1

Просто удалите while (reader.read()) из вашего кода, и вы должны увидеть данные из DataReader

SqlDataReader reader = command.ExecuteReader(); 
gvParentTasks.DataSource = reader; 
gvParentTasks.DataBind(); 
+0

Он отображает только одну строку:/ – SearchForKnowledge

+0

@SearchForKnowledge, просто попробуйте код выше, без каких-либо проверок, он должен отображать все строки в 'DataReader', убедитесь, что вы возвращаете несколько строк из запроса – Habib

1

Самый простой подход: использовать SqlDataAdapter вместо того, чтобы заполнить DataTable:

DataTable data = new DataTable(); 
using (var connection = new SqlConnection(connString)) 
using (var command = new SqlCommand(queryStringParent, connection)) 
using(var da = new SqlDataAdapter(command)) 
{ 
    // you don't need to open/close the connection with Fill 
    da.Fill(data); 
} 
gvParentTasks.DataSource = data; 
gvParentTasks.DataBind(); 

Тем не менее, следует также использовать для использования SqlDataSource как DataSource для GridView:

SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection); 
gvParentTasks.DataSource = reader; 
gvParentTasks.DataBind(); 

Я предполагаю, что причина вашей проблемы заключается в следующем:

while (reader.read()) 
{ 
} 

Он потребляет все записи.