2012-01-24 29 views
-1

なぜ私はこのエラーが発生しているのか、あなたの洞察のために、実際にはより良い方法は、それを修正する方法です。グリッドビュー内にネストされたグリッドビューがあります。より良い方法があるかもしれませんが、現時点ではモーダルポップアップを使用することができます。これは永遠に使用されます。これが完全に愚かな方法でマスターディテールを表示しない限り、今すぐ言いましょう。マスター詳細Null参照例外

詳細グリッドにdatakey idを渡すことができますが、null参照例外が発生します。バグはまだ存在しないか、または表示されません。どういうわけか、私はこれをどうやって解決するのですか?ありがとうございました。

のaspxファイル:

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> 
    <asp:GridView ID="gvForum" runat="server" DataSourceID="odsForumApproval" DataKeyNames="id" Width="200px" 
     RepeatColumns="1" DataKeyField="id" CssClass="gridview" 
     AutoGenerateColumns="False" GridLines="None" OnSelectedIndexChanged="_OnCommand"> 
     <AlternatingRowStyle CssClass="altbgcolor" /> 
     <Columns> 
     <asp:TemplateField > 
     <ItemTemplate> 
     <asp:Label runat="server" ID="lblTitle" Text='<%# Bind("Title") %>' />         

     <asp:Panel id="div" runat="server" align="center" class="confirm" style="display:none" > 
     <asp:GridView runat="server" ID="gvForumDetail" AutoGenerateColumns="False" DataKeyNames="id" 
     EmptyDataText="No Forum Detail" AllowPaging='true' 
     AllowSorting="true" PageSize="5" > 
     <AlternatingRowStyle CssClass="altbgcolor" /> 
     <RowStyle VerticalAlign="Top" HorizontalAlign="Left" /> 
     <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
      <asp:Label runat="server" ID="lblTraining" Text='<%# Bind("title") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField> 
      <ItemTemplate> 
      <asp:Label runat="server" ID="lblCompletionDate" Text='<%# Bind("description") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField> 
      <ItemTemplate> 
      <asp:Label runat="server" ID="lblRecurence" Text='<%# Bind("MemberName") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField> 
      <ItemTemplate> 
      <asp:Label runat="server" ID="lblNotes" Text='<%# Bind("itemdate") %>' Width="200" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:CommandField ShowCancelButton="true" ShowEditButton="true" ShowDeleteButton="true" /> 
     </Columns> 
     </asp:GridView>        
     <br /> 
     <asp:Button ID="btnClose" runat="server" Text="Close" Width="50px" />        
     </asp:Panel> 

     <ajaxToolKit:ModalPopupExtender ID="ModalPopupExtender1" runat="server"           
     TargetControlID="lblTitle" 
     PopupControlID="div" 
     CancelControlID="btnClose" 
     BackgroundCssClass="modalBackground" /> 

     </ItemTemplate> 
     </asp:TemplateField> 
     <asp:CommandField ShowSelectButton="True" ShowDeleteButton="true" /> 
     </Columns> 
     </asp:GridView> 

コードファイル:

public void _OnCommand(object sender, EventArgs e) 
{ 
    ObjectDataSource ods = new ObjectDataSource(); 
    ods.ID = "ods_ForumDetail"; 
    ods.EnableViewState = true; 
    ods.TypeName = "Forum"; 
    ods.SelectMethod = "GetForumPostByID"; 

    string id = ""; 
    int rowIndex = gvForum.SelectedIndex; 
    id = gvForum.DataKeys[rowIndex].Value.ToString(); 
    ods.SelectParameters.Add("id", System.TypeCode.Int32, id); 

    GridView gvForumDetail = (GridView)Master.FindControl("ContentPlaceHolder1").FindControl("gvForum").FindControl("gvForumDetail"); 
    gvForumDetail.DataSource = ods; 
    gvForumDetail.DataBind(); 
} 
+2

エラーが発生しているラインは何ですか? – Etch

+0

gvForumDetail。DataSource = ods; – Risho

+0

また、私はこのフォーラムで自分の「評価」について気にしませんが、私の投稿がどのように負の2となったのか、私の質問にはどのような調査努力も示されていないことについてはうんざりです。あなたは冗談か? WTF! – Risho

答えて

2

あなたが言われていない正確にあなたがnull参照例外を取得します。 しかし、この間接的な方法でMasterPageを介してDetail-Gridを探すのはなぜですか?

直接的な方法は非常に簡単であり、すべての少ないエラーが発生しやすい上:それとは別に

var gvForum = (GridView)sender; 
var gvForumDetail = (GridView)(gvForum.SelectedRow.FindControl("gvForumDetail")); 

、ネストされたGridViewのを見つけるためにあなたのアプローチが働くことはできません。 FindControlは、特定のIDの現在のNamingContainerのみを検索します。

(GridView)Master.FindControl("ContentPlaceHolder1").FindControl("gvForum"); 

しかし、これは...以来、あなたのネストされたのGridViewに

gvForum.FindControl("gvForumDetail"); 

をあなたにつながることはありません..:そこで働くかもしれない次が、それの一つでマスターハードリンクされたことは、常に悪いです何ContentPagesですGridView内のすべてのGridViewRowsをgvForumDetailに検索するのではなく、GridView自体のNamingContainerのみを検索します。 GridViewRowには独自のNamingContainerがあります(複数の行が存在するにもかかわらず、ItemTemplateで同じIDを使用できるようにする)ため、現在のSelectedRowを取得し、ネストされたGridを検索するだけです(上記参照)。

ネストされたGridViewの場所がまだわかりません。外部のGridViewのRowDataBoundで実行する必要があります。それがnullの理由かもしれません。 NullRefernceExceptionを取得するもう1つの理由は、可能であれば、if(!IsPostBack)ではなく、page_loadのすべてのポストバックで外部GridViewをバインドしている可能性があります。それはSelectedRowが私のアプローチで何もないようにするあなたのグリッドの選択を解除するでしょう。

+0

私はそれを試みて同じ結果を得ました。エラーはgvForumDetail.DataSource = odsです。 – Risho

+0

@Risho:私の答えを更新しました。 Btw、私はあなたにdownvotedしていないが、詳細を追加する必要があります。 –

+0

私はあなたの最初の例を試して終わったし、それは働いた。私はもっ​​と詳細に何を追加すればいいのか分かりません。私が貼り付けたのはコードの肉です。 – Risho

0

ここでは、ネストされたグリッドビューの操作方法を簡単に説明します。 Link

私はティムに同意します。あなたは奇妙なことをしています。また、宣言的にHTMLでオブジェクトデータソースを作成するので、すべてのコマンドを動的に作成する必要はありません。

更新 ここでは、これはあなたがやりたいと、あなたの内のGridViewに選択パラメータを渡す方法をステップバイステップで表示する映像である別のLinkです。 (約3:40)。

+0

OK、私はこのコミュニティの中で、otdをhtmlで作成することを断念しました。私はそれがn層アーキテクチャに違反しているので、このインスタンスのように動作させることはできません。 htmlでodsを使用すると、マスターグリッドから詳細グリッドにIDを渡すにはどうすればいいですか? – Risho

+0

別のリンクを追加しました。これはあなたがしたいことをする方法のビデオです。約3:44にスキップする場合は、外側のグリッドから内側のグリッドにパラメータを渡す方法がわかります。 – Etch

+0

あなたの時間と労力をいただき、ありがとうございました。 – Risho