如何在ASP.NET GridView中访问基础数据表

如何在ASP.NET GridView中访问基础数据表,asp.net,gridview,datatable,Asp.net,Gridview,Datatable,我在ASP.NET页面上有一个分页的GridView。在GridView控件的DataBound事件中,我试图将行中每个单元格的OnClick事件更新为window.open(),使用基础DataTable中未显示在GridView中的字段打开一个新页面。但是,GridView数据源属性为null,GridViewRow数据项属性也是如此。GridView的数据键的计数为0。分页的数据集有20行,正在正确呈现,我只是找不到底层数据来提取window.open()调用所需的ID 我在构建页面时遵循

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

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

  • 所以我有一个DAL->BLL->ObjectDataSource->GridView。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>
    
    
    ...
    

    如何访问基础数据表中的pdf_id值?

    尝试在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>
    

    我同意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"];
        }
    }
    

    您可以找到一个示例

    我之所以避免使用带有超链接的单独列,是因为水平屏幕的不动产有点稀少,所以我希望整行都可以单击以打开相关文档。将DataSourceObject强制转换为DataTable或DataView会导致空值,因此我不确定如何从DataSourceObject中获取数据值。我所做的是使用第一个示例,并将所有条目替换为条目。工作起来很有魅力!
    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"];
        }
    }