2016-02-10 24 views
0

將列添加基於數據列到GridView編程容易。GridView控件:如何從一個單獨的數據源

有例子herehere.

Here是一個類似的問題,但它已經回答了同樣的方式 - 創建一個數據表,並將其綁定到GridView。

,但不會是刪除原始鏈接到主數據源?

GridView下面已經有一個綁定到sqldatasource下方。

  Text="Location Board" Width="100%"></asp:Label> 
     <asp:GridView ID="gvLocationBoard" runat="server" AllowPaging="True" AllowSorting="True" 
      AutoGenerateColumns="False" CellPadding="4" DataSourceID="sdsLocationBoard" 
      ForeColor="#333333" GridLines="None"> 
      <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
      <Columns> 
... 
... 
      </Columns> 
      <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
      <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> 
      <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> 
      <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
      <EditRowStyle BackColor="#999999" /> 
      <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> 
     </asp:GridView> 
     <asp:SqlDataSource ID="sdsLocationBoard" runat="server" ConnectionString="<%$ ConnectionStrings:ATCNTV1ConnectionString %>" 
      SelectCommand="SELECT rce.RollCallID, v1.StudentID, v1.StudentPreferredName + ' ' + v1.StudentFamilyName AS StudentName, cs.CheckStatusName, rce.DateSubmitted, rce.StaffID, rcp.RollCallPeriod, rcp.PeriodStart, rcp.PeriodEnd FROM vwBoardingTenants AS v1 LEFT OUTER JOIN tblBoardingRollCallEntries AS rce ON rce.StudentID = v1.StudentID LEFT OUTER JOIN tblBoardingCheckStatus AS cs ON cs.CheckStatusID = rce.CheckStatusID LEFT OUTER JOIN tblBoardingRollCallPeriods AS rcp ON rcp.RollCallPeriodID = rce.RollCallPeriodID AND rcp.RowStatus = 1 AND rcp.PeriodYear = YEAR(@SelectedDate) AND dbo.fnDateOnly(@SelectedDate) BETWEEN rcp.PeriodStart AND rcp.PeriodEnd WHERE (dbo.fnDateOnly(rce.DateSubmitted) = dbo.fnDateOnly(@SelectedDate)) AND (v1.Year = YEAR(@SelectedDate))"> 
      <SelectParameters> 
       <asp:ControlParameter ControlID="txtSelectedDate" Name="SelectedDate" Type="DateTime"/> 
      </SelectParameters> 
     </asp:SqlDataSource> 

不過,如果你想列標題添加到一個基於數據源的GridView控件是完全獨立的(個人)的主要數據來源,對整個GridView的是什麼?

這是我的 「列」 SQL數據源...

<asp:SqlDataSource ID="sdsRollCallPeriods" runat="server" ConnectionString="<%$ ConnectionStrings:ATCNTV1ConnectionString %>" 
      SelectCommand="SELECT RollCallPeriodID, RollCallPeriod, PeriodYear, PeriodStart, PeriodEnd, RowStatus FROM tblBoardingRollCallPeriods WHERE (RowStatus = 1) AND (PeriodYear = @PeriodYear)" 
      OnSelecting="sdsRollCallPeriods_Selecting"> 
      <SelectParameters> 
       <asp:Parameter Name="PeriodYear" Type="Int32" /> 
      </SelectParameters> 
     </asp:SqlDataSource> 

我想直到結束是這樣一個GridView ...

User can click any of the check boxes on the right of the gridview

上的複選框權利和時間,如標題,是新列我想基礎上,sdsRollCallPeriods SqlDataSource的補充。

+1

您總是可以在包含複選框的'ItemTemplate'中聲明式添加列。然後通過'Eval'或代碼隱藏將它們的'Checked'狀態設置爲aspx。最好的地方就是'GridView'的'RowDataBound'事件。你必須使用'(CheckBox)row.FindControl(「CheckBoxId」)'來獲得引用。底層的數據源可以通過'row.DataItem'訪問。 –

回答

0

那麼它不是一個真正的解決方案,而是一個變通辦法,這對我的作品。

我已經添加了我所需要的列,只是它們都設置爲Visible="false"

 <asp:GridView ID="gvLocationBoard" runat="server" AllowPaging="True" AllowSorting="True" ShowFooter="false" ShowHeader="true" Visible="true" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" 
      DataSourceID="sdsLocationBoard" OnDataBound="gvLocationBoard_DataBound" OnRowDataBound="gvLocationBoard_RowDataBound" PageSize="15"> 
      <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
      <Columns> 
       <asp:TemplateField HeaderText="RollCallID" InsertVisible="False" SortExpression="RollCallID" 
        Visible="False"> 
        <ItemTemplate> 
         <asp:Label ID="Label1" runat="server" Text='<%# Eval("RollCallID") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="StudentID" SortExpression="StudentID" Visible="False"> 
        <ItemTemplate> 
         <asp:Label ID="Label2" runat="server" Text='<%# Eval("StudentID") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Student" SortExpression="StudentName"> 
        <ItemTemplate> 
         <asp:Label ID="Label3" runat="server" Text='<%# Eval("StudentName") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Status" SortExpression="CheckStatusName" ItemStyle-HorizontalAlign="Center"> 
        <ItemTemplate> 
         <asp:Label ID="Label4" runat="server" Text='<%# Eval("CheckStatusName") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="RollCallPeriod0" Visible="False"> 
        <ItemTemplate> 
         <asp:CheckBox ID="cbRollCallPeriod0" runat="server" /> 
         <asp:HiddenField ID="hfRollCallPeriod0" runat="server" Value='<%# Eval("RollCallPeriod") %>' /> 
        </ItemTemplate> 
        <HeaderStyle Font-Size="Small" /> 
        <ItemStyle HorizontalAlign="Center" /> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="RollCallPeriod1" Visible="False"> 
        <ItemTemplate> 
         <asp:CheckBox ID="cbRollCallPeriod1" runat="server" /> 
         <asp:HiddenField ID="hfRollCallPeriod1" runat="server" Value='<%# Eval("RollCallPeriod") %>' /> 
        </ItemTemplate> 
        <HeaderStyle Font-Size="Small" /> 
        <ItemStyle HorizontalAlign="Center" /> 
       </asp:TemplateField> 
.. 
etc with the RollCallPeriod2, 3, 4 and so on, as many as required. 

我然後將它們打開上Page_Load(),取決於一天的時候,我需要。

DataSourceSelectArguments args = new DataSourceSelectArguments(); 
    DataView dv = sdsRollCallPeriods.Select(args) as DataView; 
    DataTable dt = dv.ToTable() as DataTable; 
    if (dt != null) 
    { 
     int wsCol = 4; //start of PeriodTimes column in gvLocationBoard 
     int wsPos = 0; 
     foreach (DataRow dr in dt.Rows) 
     { 
      gvLocationBoard.Columns[wsCol + wsPos].HeaderText = dr.ItemArray[1].ToString(); 
      gvLocationBoard.Columns[wsCol + wsPos].Visible = !gvLocationBoard.Columns[wsCol + wsPos].HeaderText.StartsWith("RollCallPeriod"); 

      wsPos += 1; 
     } 
    } 

瞧,我有我的行和我的動態列!

相關問題