如何在ASP.NET GridView中访问基础DataTable

时间:2012-01-19 18:45:05

标签: asp.net gridview datatable

我在ASP.NET页面上有一个分页的GridView。在GridView控件的DataBound事件中,我试图将行中每个单元格的OnClick事件更新为window.open()一个新页面,使用底层DataTable中未显示在GridView中的字段。但是,GridView DataSource propety为null,GridViewRow DataItem属性也是如此。 GridView的DataKeys的Count为0.分页DataSet有20行并且正在正确呈现,我只是找不到底层数据来提取window.open()调用所需的ID。

我在构建页面时遵循了asp.net的指南:

  1. Creating a data access layer
  2. Creating a business access layer
  3. Displaying Data with ObjectDataSource
  4. 所以我有一个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 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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