【问题标题】:How do I access the underlying DataTable in an ASP.NET GridView如何访问 ASP.NET GridView 中的基础 DataTable
【发布时间】:2012-01-19 18:45:05
【问题描述】:

我在 ASP.NET 页面上有一个分页的 GridView。在 GridView 控件的 DataBound 事件中,我尝试使用未显示在 GridView 中的基础 DataTable 中的字段将行中每个单元格的 OnClick 事件更新为 window.open() 一个新页面。但是,GridView DataSource 属性为空,GridViewRow DataItem 属性也是如此。 GridView 的 DataKeys 的计数为 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

所以我有一个 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>

如何访问底层 DataTable 中的 pdf_id 值?

【问题讨论】:

    标签: asp.net gridview datatable


    【解决方案1】:

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

    【讨论】:

    • 我避免在其中包含超链接的单独列的原因是水平屏幕空间有点稀缺,所以我宁愿让整行可点击以打开相关文档。将 DataSourceObject 转换为 DataTable 或 DataView 会导致 null 值,所以我不确定如何从 DataSourceObject 中获取数据值。
    • 我所做的是使用您的第一个示例并将所有 条目替换为 条目。像魅力一样工作!
    【解决方案2】:

    我同意 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

    【讨论】:

      猜你喜欢
      • 2012-01-12
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多