2012-01-24 30 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