2012-01-19 38 views
1

我在ASP.NET頁面上有分頁的GridView。在GridView控件的DataBound事件中,我試圖使用GridView中未顯示的底層DataTable中的字段將行中每個單元格的OnClick事件更新爲window.open()新頁面。但是,GridView DataSource的propety爲null,GridViewRow的DataItem屬性也是如此。 GridView的DataKeys的計數爲0.分頁的DataSet有20行並且正在渲染正確,我找不到底層數據來獲取window.open()調用所需的ID。如何訪問ASP.NET GridView中的底層數據表

構建我的網頁時,我都遵循asp.net指南:

  1. Creating a data access layer
  2. Creating a business access layer
  3. Displaying Data with ObjectDataSource

所以我有一個DAL - > BLL - > ObjectDataSource控件 - >網格視圖。 ID列被隱藏在GridView中:

<asp:GridView ID="pdfdocuments" runat="server" AllowPaging="True" 
     AutoGenerateColumns="False" DataSourceID="pdfods" PageSize="20" 
     ondatabound="pdfdocuments_DataBound"> 
     <PagerSettings Mode="NumericFirstLast" /> 
     <Columns> 
      <asp:BoundField DataField="pdf_id" HeaderText="pdf_id" InsertVisible="False" 
       ReadOnly="True" SortExpression="pdf_id" Visible="False" /> 
... 
     </Columns> 
     <HeaderStyle BackColor="#FFCC99" /> 
     <AlternatingRowStyle BackColor="#FFFFCC" /> 
    </asp:GridView> 

如何訪問底層DataTable中的pdf_id值?

回答

2

嘗試訪問RowDataBound事件中的GridView.DataSourceObject。

除非是使用JavaScript window.open它可能是最好使用一個錨定標記與目標類似下面的代碼的一些要求:

<asp:GridView ID="GridView1" runat="server" DataSourceID="ODS1" 
    OnRowDataBound="GridView1_RowDataBound" AutoGenerateColumns="False"> 
    <Columns> 
     <asp:HyperLinkField DataTextField="FieldName" DataNavigateUrlFields="FieldID" DataNavigateUrlFormatString="somePage.aspx?id={0}" Target="_blank" /> 
    </Columns> 
</asp:GridView> 

如果必須執行JavaScript,你仍然可以做到這一點無需直接使用TemplateField訪問底層DataSourceObject:

<asp:GridView ID="GridView1" runat="server" DataSourceID="ODS1" 
    OnRowDataBound="GridView1_RowDataBound" AutoGenerateColumns="False"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <a href='javascript:window.open(<%# Eval("FieldID") %>);'><%#Eval("FieldName")%></a> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 
+0

我避免與超鏈接單獨的列在它是橫屏房地產是有點稀缺的原因,所以我寧願整個行可點擊打開相關的文件。將DataSourceObject轉換爲DataTable或DataView會產生空值,因此我不確定如何從DataSourceObject中獲取數據值。 – Brandon

+0

我所做的就是使用第一個示例,並用條目替換了所有條目。奇蹟般有效! – Brandon

0

我同意D-Mac使用RowDataBound事件。但不是使用GridView.DataSourceObject嘗試訪問該行的DataItem屬性。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    DataRowView rowView = e.Row.DataItem as DataRowView; 
    if (rowView != null) 
    { 
     //Check if the execution reach this pont 
     object pdf_id = rowView["pdf_id"]; 
    } 
} 

你可以找到一個例子here