0

恐れ入りますが、かなり長い質問があります。私はASP.NETにかなり慣れていないので、ご容赦ください。多数のオプションを一覧表示する ASP.NET ページのコントロールを作成しました。各オプションには 2 つのクリック可能な領域があります (わかりやすくするためにボタンと呼びます)。1 つはオプションを選択し、もう 1 つはオプションを非表示にします。


protected void Page_Load(object sender, EventArgs e)
{
  RenderOptions();
}

public void RenderOptions()
{
  for (int i = 0; i < 5; i++) {
    HtmlGenericControl div1 = new HtmlGenericControl("div");
    div1.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(this, "option" + i));
    m_TreeContainer.Controls.Add(div1);

    HtmlGenericControl div2 = new HtmlGenericControl("div");
    div2.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(this, "option" + i));
    m_TreeContainer.Controls.Add(div2);
  }
}

public void RaisePostBackEvent(string arg) 
{
  //do something
}

これは問題なく動作します (私は IPostBackEventHandler インターフェイスを実装しています)。ここでの問題は、どの HTML 要素がクリックされたか、つまり RaisePostBackEvent メソッドでどのアクションを実行する必要があるかを見つける方法がないように思われることです。

私がやろうとしたことは、次のような新しいクラス (HtmlDivControl) を作成することです。


class HtmlDivControl : HtmlGenericControl, IPostBackEventHandler
{
  #region Delegates
  public delegate void ClickEventHandler(object sender, string eventArgument);
  #endregion

  #region Properties
  private ClickEventHandler m_Click;
  public ClickEventHandler Click
  {
    get { return m_Click; }
    set { m_Click = value; }
  }
  #endregion

  #region Constructors
  public HtmlDivControl()
  {
  }
  #endregion

  public void RaisePostBackEvent(string eventArgument)
  {
    m_Click.Invoke(this, eventArgument);
  }
}

ここで、div1 と div2 を HtmlGenericControl ではなく HtmlDivControl にし、Click プロパティをメソッド (デリゲート) に設定し、div (div1 または div2) 自体を GetPostBackEventReference メソッドのコントロールとして渡しました。今回は、div を区別するだけでなく、実行するアクションを事前に決定することもできました。ただし、コントロールの RaisePostBackEvent は PageLoad の後に呼び出されます。したがって、私が今抱えている問題は、イベントが処理される前にオプション コントロール全体がレンダリングされることです (したがって、たとえば非表示にする必要があるオプションは、レンダリング後に実際の非表示が行われるため、そうではありません)。RenderOptions() 呼び出しを PageLoadComplete メソッドに移動しても、div コントロールがまだ存在しないため、役に立ちません。

ここで非常に基本的な何かが欠けていると確信しています。しかし、誰かが私がこのようなことにどのようにアプローチすべきかを説明してもらえますか?

ps ここにアンダースコアを書くにはどうすればよいですか? テキストを斜体にするために使用されますか? エスケープ文字はありますか?

4

1 に答える 1

2

ASP.Net を初めて使用する人にとっては、これまでのところかなりうまくいっています。ここでの障害は、実際に問題について考えている方法です。ASP.Net ページのライフサイクルをよく理解する必要があります。非常に基本的なことが抜けています。

簡単に言えば、ポストバック前と同じ状態にページを再構築する必要があります。次に、イベントを処理します。次に、状態を変更します。

リクエストの開始時に HTML コントロールが状態の変化を認識している必要があるかのように考えていますが、これは正しくありません。最初に再構築フェーズが必要です。これは、ASP.Net がどのイベントを発生させるかを判断するためにも重要です。

私がお勧めするもの:

  1. "RenderOptions()" メソッドを Page_Init ハンドラに移動します。これにより、ViewState をコントロールに組み込む場合に、多くの問題を回避できます。(実際には何もレンダリングしていないため、名前を変更します。コントロールをページに追加するだけです。Render には ASP.Net で特定のコンテキストがあります)。

  2. 次に、コントロールの OnClick イベント ハンドラーで、コントロールの表示方法を制御するのではなく、必要に応じてコントロールの可視性を設定します。コントロールがページにレンダリングされる方法を変更しようとするよりも、コントロールを Visible=False に設定する方が常に簡単です。Visible=False を設定すると、そのコントロールの応答に html が送信されなくなりますが、サーバーはそれがページ上にあることを認識しているため、引き続き処理できます。

イベント ハンドラーは、ページの状態を変更する場所と考えてください。この場合、Page_Load ではなく、ロジックを配置する必要があります。

于 2009-08-06T15:47:02.330 に答える