2012-01-19 3 views
1

ASP.NETページにページ区切りのGridViewがあります。 GridViewコントロールのDataBoundイベントで、GridViewに表示されていない基になるDataTableのフィールドを使用して、行の各セルのOnClickイベントをwindow.open()に更新しようとしています。ただし、GridView DataSourceプロパティはnullであり、GridView DataSourceプロパティもnullです。 GridViewのDataKeysのカウントは0です。ページングされたDataSetは20行あり、適切にレンダリングされています。window.open()呼び出しに必要なIDを取得するための基礎データは見つかりません。私のページを構築するとき、私はasp.netのガイドに従っているASP.NET GridViewで基になるDataTableにアクセスするには

  1. Creating a data access layer
  2. Creating a business access layer
  3. だから私はDALを持ってDisplaying Data with ObjectDataSource

- > 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にアクセスしてみてください。

それwindow.openのJavaScriptを使用するには、いくつかの要件がありますない限り、次のコードのようなターゲットでアンカータグを使用することはおそらく優れている:あなたはまだそれを行うことができますJavaScriptを実行する必要がある場合は

<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> 

直接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にキャストするとnull値になるため、DataSourceObjectからデータ値を取得する方法が不明です。 – Brandon

+0

私が行ったことは、あなたの最初の例で使用され、のすべてのエントリをエントリに置き換えました。魅力的な作品! – Brandon

0

私はRowDataBoundイベントを使用するためにD-マックに同意します。 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

関連する問題