0

2 つのユーザー コントロールがあります。各ユーザー コントロールには、ListView が含まれています。これら 2 つのユーザー コントロールの目的は、マスター/詳細データを表示することです。イベント ResourceReassigned を発生させると、null 参照例外が常にスローされます。イベント ハンドラーの割り当てが機能していないということは、何が間違っているのでしょうか?

<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();
  }

}
4

2 に答える 2

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);
        }
       }

}

于 2012-12-17T08:34:59.847 に答える
1

NullReferenceExceptionイベントが発生した時点でサブスクライバーが存在しないため、 がスローされます。VB.NET では "RaiseEvent" を安全に呼び出すことができますが、C# では、最初にイベント オブジェクトがそうでないかどうかを確認する必要がありますnull

if (ResourceReassigned != null)
    ResourceReassigned(sender, EventArgs.Empty);
于 2012-12-14T11:16:12.590 に答える