Как получить доступ к базовой DataTable в ASP.NET GridView - PullRequest
1 голос
/ 19 января 2012

У меня есть разбитый на страницы GridView на странице ASP.NET. В событии DataBound элемента управления GridView я пытаюсь обновить событие OnClick каждой ячейки в строке до window.open () новой страницы, используя поле в базовом DataTable, которое не отображается в GridView. Однако свойство GridView DataSource равно нулю, как и свойство GridViewRow DataItem. DataKeys GridView имеет счетчик 0. У разбитого на страницы DataSet 20 строк, и он отображается правильно, я просто не могу найти базовые данные, чтобы получить идентификатор, необходимый для вызова window.open ().

Я следовал руководству asp.net при создании своей страницы:

  1. Создание слоя доступа к данным
  2. Создание уровня доступа к бизнесу
  3. Просмотр данных с помощью 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>

Как получить доступ к значению pdf_id в базовом DataTable?

Ответы [ 2 ]

2 голосов
/ 19 января 2012

Попробуйте получить доступ к GridView.DataSourceObject в событии RowDataBound.

Если нет каких-либо требований использовать 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, вы все равно можете это сделать, не обращаясь непосредственно к базовому DataSourceObject, используя TemplateField:

<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 голосов
/ 20 января 2012

Я согласен с 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"];
    }
}

Вы можете найти пример здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...