2015-01-21 2 views
0

На моей веб-форме для ASP.Net я показываю таблицу с SQL Server. Однако то, что я хотел бы сделать, это предложить пользователю веб-страницы возможность проверять некоторые поля и показывать только те конкретные столбцы, когда я обновляю страницу.Отображение динамического представления сетки из оператора SQL select

Вот ASPX HTML:

<div style="width: 1250px; height: 300px; overflow: auto"> 
    <asp:GridView ID="GridView1" HeaderStyle-BackColor="Black" HeaderStyle-ForeColor="Silver" RowStyle-BackColor="#EEEEEE" AlternatingRowStyle-BackColor="White" 
     AlternatingRowStyle-ForeColor="#000" runat="server" AutoGenerateColumns ="false" AllowPaging="false" OnPageIndexChanging="OnPageIndexChanging" AllowSorting="True"> 
     <Columns> 
      <asp:BoundField DataField ="WeekEndingDate" HeaderText="Week Ending Date" ItemStyle-Width="150px" dataformatstring="{0:MM-dd-yyyy}" /> 
      <asp:BoundField DataField ="Week_Number" HeaderText="Week Number" ItemStyle-Width="150px" /> 
      <asp:BoundField DataField ="Class" HeaderText="Class" ItemStyle-Width="150px" /> 
      <asp:BoundField DataField ="Animal" HeaderText="Animal" ItemStyle-Width="150px" /> 
      <asp:BoundField DataField ="North_Island" HeaderText="North Island" ItemStyle-Width="150px" DataFormatString="{0:F2}" /> 
      <asp:BoundField DataField ="South_Island" HeaderText="South Island" ItemStyle-Width="150px" DataFormatString="{0:F2}" /> 
      <asp:BoundField DataField ="New_Zealand" HeaderText="New Zealand" ItemStyle-Width="150px" DataFormatString="{0:F2}" /> 
     </Columns> 
    </asp:GridView> 
</div> 

Вот метод bindgrid:

private void BindGrid() 
    { 
     string strConnString = "server= N-1077; Trusted_Connection=yes; database=Slaughter; connection timeout=30"; 
     using (SqlConnection con = new SqlConnection(strConnString)) 
     { 
      using (SqlCommand cmd = new SqlCommand("SELECT CONVERT(date, Week_Ending_Date) AS WeekEndingDate," + 
       "Week_Number, Class, North_Island = CAST(North_Island as float), South_Island = CAST(South_Island as float)," + 
       "(CAST(North_Island as float)) + (CAST(South_Island as float)) AS New_Zealand," + 
       "Animal = (CASE WHEN Class = 'Sheep' OR Class = 'Lamb' THEN 'Ovine' WHEN Class = 'Calf' THEN 'Calf' ELSE 'Bovine' END)" + 
       "FROM Slaughter ORDER BY WeekEndingDate DESC")) 
      { 
       using (SqlDataAdapter sda = new SqlDataAdapter()) 
       { 
        cmd.Connection = con; 
        sda.SelectCommand = cmd; 
        using (DataTable dt = new DataTable()) 
        { 
         sda.Fill(dt); 
         GridView1.DataSource = dt; 
         GridView1.DataBind(); 
        } 
       } 
      } 
     } 
    } 

Есть простой способ выбрать конкретные столбцы и только показать это? т. е. если их интересовали только week_number, class и south_island, они отображали только данные для этих трех столбцов? Я не возражаю против создания SQL-запроса на основе пользовательских входов, но это то, как я изменяю поле данных Fieldfield Fieldfield, чтобы отразить те столбцы, которые были выбраны в этом запросе.

+0

asp.BoundField имеет Visible свойство. Установите его в false, и столбец станет скрытым. – evpo

ответ

1

Это один из способов сделать это с видимым свойством.

protected void RefreshSQLDisplay(object sender, EventArgs e) 
{ 
    foreach (BoundField col in GridView1.Columns) 
    { 
     if (col.DataField == "WeekEndingDate") 
     { 
      col.Visible = false; 
      break; 
     } 
    } 
} 

Недостатком является то, что столбцы будут по-прежнему в памяти, и запрос sql будет извлекать данные. Поэтому лучше всего изменить запрос sql по соображениям производительности.

Update: Я редактировал код, как вы просили

+0

Я пытаюсь это сделать, но получаю сообщение об ошибке, если не будет найден метод расширения 'DataField', принимающий первый аргумент типа 'object' (вам не хватает директивы using или ссылки на сборку?). У меня есть: using System.Web; с использованием System.Web.UI; с использованием System.Web.UI.WebControls; – Danrex

+0

Я не компилировал код. Я обновил ответ с помощью вашего кода. – evpo

+0

Достаточно хорошо для меня, что вы дали мне ответ, он просто не работал в этом формате. – Danrex