恐れ入りますが、かなり長い質問があります。私は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 ここにアンダースコアを書くにはどうすればよいですか? テキストを斜体にするために使用されますか? エスケープ文字はありますか?