2009-08-06 17 views
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)を作成することです:メソッドをクリックしてプロパティを設定し、今私は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. ここにアンダースコアを書きますか?彼らはテキストをイタリック体にするのに使われていますか?エスケープ文字がありますか?

+1

このコントロールでは、正確に何をしようとしていますか?あなたがASP.Netの初心者であれば、私のアドバイスはカスタムコントロールクラスから離れていくことです。 – John

+0

Page_LoadはMicrosoftが思いついたものです。私はそうではありません:-)また、非常に有効な文字の使用。しかし、これはまったく異なる議論です。 @John:カスタムコントロールから離れたい場合は、ASP.NETのより複雑な側面をどのように学びますか?明確にするために、私はASP.NETやプログラミング全般で最初のステップを踏み出しているわけではありません。私があなたが投稿したものに基づいて、私は間違った方向にこれを取っています。もしそうなら、私に正しい方法を教えてください。 – Jerry

+0

私が離れていると言われた理由は、他のプロジェクトでこのコントロールを再利用する予定がない限り、ほとんどの場合、組み込みのコントロールを持つよりシンプルで洗練されたソリューションがあります。あるいは、UserControl – John

答えて

2

ASP.Netを初めてお使いの方には、これまでかなりうまくやっています。あなたの障害物は実際にあなたがその問題について考えている方法です。 ASP.Netのページライフサイクルをよく理解しておく必要があります。

簡単に言えば、ポストバックの前と同じ状態にページを再構築したいとします。その後、イベントを処理します。次に状態を変更します。

あなたは、あなたのhtmlコントロールがリクエストの開始時に状態の変化を知っているかのように考えていますが、それは間違っています。まず、再構築段階があります。これは、ASP.Netがどんなイベントを発生させるかを把握するためにも重要です。 Page_Initハンドラーにあなたの "RenderOptions()" メソッドを移動

  1. :私は何を推薦する

    。これにより、ViewStateをコントロールに組み込むことができれば、多くの問題を軽減できます。 (レンダリングには、実際に何もレンダリングされていないので、ページにコントロールを追加するだけです。レンダリングにはASP.Netの特定のコンテキストがあります)。

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

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

関連する問題