2012-12-14 48 views
0

我有两个用户控件。每个用户控件包含一个ListView。这两个用户控件的用途是显示主数据/详细数据。当引发事件ResourceReassigned时,总是抛出一个空引用异常。我在做什么错误,这意味着我的事件处理程序分配不工作?从另一个用户控件刷新用户控件中的ListView

<asp:ListView ID="lvStaffer" runat="server"> 
    <LayoutTemplate> 
    <table> 
     <tr id="itemplaceholder" runat="server"></tr> 
    </table> 
    </LayoutTemplate> 
    <ItemTemplate> 
    <tr> 
     <td>      
     <asp:UpdatePanel ID="upResourceListViewControlItem" runat="server"> 
      <ContentTemplate> 
      <rw:ResourceListViewControl ID="ResourceListViewControlItem" runat="server" /> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
     </td> 
    </tr> 
    </ItemTemplate> 
</asp:ListView> 


public partial class Control_ResourceListViewControl : StafferWebControlBase 
{ 

    public event EventHandler ResourceReassigned; 

    protected void lvResource_ItemUpdating(Object sender, ListViewUpdateEventArgs e) 
    { 
    // If an item in lvResource is updated we want to refresh the master lvStaffer 
    // ListView so we raise an event. Null Reference Exception is thrown here. 
    ResourceReassigned(sender, new EventArgs()); 
    } 

} 

public partial class Control_StafferListViewControl : StafferWebControlBase 
{ 

    protected void lvStaffer_ItemDataBound(Object sender, ListViewItemEventArgs e) 
    { 
    Control_ResourceListViewControl resourceListViewControlItem = 
(Control_ResourceListViewControl)e.Item.FindControl("ResourceListViewControlItem"); 

    if (resourceListViewControlItem != null) 
    { 
     // Each item in lvStaffer contains an instance of the ResourceListViewControl object. 
     // Each object is a subscriber of the ResourceReassigned event. 
     resourceListViewControlItem.ResourceReassigned += new EventHandler(lvStaffer_ResourceReassigned); 
    } 

    } 

    protected void lvStaffer_ResourceReassigned(object sender, EventArgs e) 
    { 
    // Repopulates and binds the lvStaffer ListView 
    ResetStafferListView(); 
    } 

} 
+1

做才能让你的数据绑定列表视图每次或只要页面没有回传? –

+0

仅当页面不是回发时,lvStaffer ListView才被绑定。 – dior001

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

回答

1

我想你应该绑定你的事件每次(如果页面不仅没有回发)。例如在Page_Load事件或控件OnLoad上。

protected void Page_Load(object sender, EventArgs e){  
    foreach (ListViewItem item in lvStaffer.Items) 
     { 
      Control_ResourceListViewControl resourceListViewControlItem = 
     (Control_ResourceListViewControl)e.Item.FindControl("ResourceListViewControlItem"); 

     if (resourceListViewControlItem != null) 
     { 
      // Each item in lvStaffer contains an instance of the   ResourceListViewControl object. 
      // Each object is a subscriber of the ResourceReassigned event. 
      resourceListViewControlItem.ResourceReassigned += new EventHandler(lvStaffer_ResourceReassigned); 
     } 
     } 

}

1

NullReferenceException被抛出是因为在引发事件时没有订阅者。虽然你可以安全地调用在VB.NET“的RaiseEvent”,在C#中,你首先需要检查事件对象是否是不null

if (ResourceReassigned != null) 
    ResourceReassigned(sender, EventArgs.Empty); 
+0

谢谢你的回答。我知道没有订户,我应该先检查是否为空。但我不明白为什么没有订户。 ResourceListViewControlItem对象的每个实例都有lvStaffer_ResourceReassigned订阅者。这是在lvStaffer ListView的ItemDataBound事件处理程序中指定的,因此它不应该为空,因为订阅者应始终存在。 – dior001

+1

@ ernie99我建议您使用调试器来了解为什么在父控件的“ItemDataBound”处理程序之前调用“ItemUpdating”事件处理程序的原因。我认为这是你程序的逻辑。 – volpav

相关问题