私は恐ろしい質問があります。私はかなり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)を作成することです:メソッドをクリックしてプロパティを設定し、今私はDIV1を作り、むしろHtmlGenericControlよりも私のHtmlDivControlをDIV2
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);
}
}
(デリゲート)、div(div1またはdiv2)自体をGetPostBackEventReferenceメソッドのコントロールとして渡しました。今回は、divを区別するだけでなく、実行すべきアクションを事前に決定することもできました。ただし、コントロールのRaisePostBackEventはPageLoadの後に呼び出されます。だから私が今いる問題は、イベントが処理される前にオプションのコントロール全体がレンダリングされるということです(したがって、実際の隠蔽がレンダリングの後に行われるため、隠されるべきオプションはありません)。 RenderOptions()呼び出しをPageLoadCompleteメソッドに移動することはどちらも役に立ちません。divコントロールはまだ存在しないためです。
私はここでかなり基本的なものが欠けていると確信しています。しかし、誰かが私にこのような何かにアプローチすべきか説明してもらえますか?
P.S. ここにアンダースコアを書きますか?彼らはテキストをイタリック体にするのに使われていますか?エスケープ文字がありますか?
このコントロールでは、正確に何をしようとしていますか?あなたがASP.Netの初心者であれば、私のアドバイスはカスタムコントロールクラスから離れていくことです。 – John
Page_LoadはMicrosoftが思いついたものです。私はそうではありません:-)また、非常に有効な文字の使用。しかし、これはまったく異なる議論です。 @John:カスタムコントロールから離れたい場合は、ASP.NETのより複雑な側面をどのように学びますか?明確にするために、私はASP.NETやプログラミング全般で最初のステップを踏み出しているわけではありません。私があなたが投稿したものに基づいて、私は間違った方向にこれを取っています。もしそうなら、私に正しい方法を教えてください。 – Jerry
私が離れていると言われた理由は、他のプロジェクトでこのコントロールを再利用する予定がない限り、ほとんどの場合、組み込みのコントロールを持つよりシンプルで洗練されたソリューションがあります。あるいは、UserControl – John