2012-01-24 31 views
-1

爲了您的洞察力,爲了解我爲什麼出現此錯誤,實際上更好,還有如何解決它。我有一個GridView內嵌套的gridview。可能有更好的方法,但在這一點上,我已經得到了模式彈出工作,這也是永遠的,所以除非這是完全愚蠢的方式來顯示主細節,那麼現在就說出來。主要細節空引用異常

我能夠將datakey id傳遞給詳細網格,但那是我得到空引用異常的地方,我猜這個bug沒有存在,或者是不可見的。我的意思是,無論什麼原因,我該如何解決這個問題?感謝advace。

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

你沒有告訴你的準確獲取空引用的異常。 但是,爲什麼你要通過MasterPage去間接的方式來找到你的Detail-Grid?

的直接的方法是非常容易和最不容易出錯:

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

除此之外,你的方法找到了嵌套的GridView不能正常工作。 FindControl只會搜索當前的NamingContainer給定的ID。因此,以下可能的工作,但與它的一個hardlinking主人的內容網頁,什麼總是不好:

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

但是,這不會導致你嵌套的GridView自...

gvForum.FindControl("gvForumDetail"); 

.. 。將不會搜索GridView中的所有GridViewRow爲gvForumDetail,而只搜索GridView本身的NamingContainer。一個GridViewRow擁有自己的NamingContainer(爲了能夠在ItemTemplate中使用相同的ID,儘管存在多行),所以唯一正確的方法是獲取當前的SelectedRow並在那裏搜索嵌套的Grid(參見上文)。

您尚未顯示您的嵌套GridView的位置DataBind。這應該在外部GridView的RowDataBound中完成。這可能是它爲空的原因。 獲取NullRefernceException的另一個原因可能是您可能在page_load的每次回發中DataBinding外部GridView,而不是僅在if(!IsPostBack)。這將取消您的網格,導致SelectedRow在我的方法中沒有任何意義。

+0

我試過了,得到相同的結果。錯誤在gvForumDetail.DataSource = ods。 – Risho

+0

@Risho:更新了我的答案。順便說一句,我沒有downvoted你,雖然你應該增加更多的細節。 –

+0

我已經結束了嘗試你的第一個例子,它的工作。我不確定我應該添加哪些細節。我所粘貼的代碼非常簡單。 – Risho

0

這是一個關於如何做嵌套gridviews的簡單演練。 Link

我同意蒂姆,你正在做一些奇怪的事情。我還會聲明性地在HTML中創建objectdatasource,因此您不必每個命令都動態創建它。

更新 這裏是另一個Link這是爲了告訴你一步一步如何做你想做的,並通過選擇參數,你內心的GridView的視頻。 (約3:40)。

+0

好吧,我放棄了與社區討論在html中創建ods,因爲我的對手「違反」了n層架構,除此之外,我永遠無法得到它。當您在html中使用ods時,如何將主網格中的id傳遞到詳細網格? – Risho

+0

我添加了另一個鏈接。這是一個如何做你想做的視頻。如果你想跳到大約3:44,你會看到如何將你的參數從外部網格傳遞到內部網格。 – Etch

+0

感謝您的時間和精力,鏈接非常有用。 – Risho