2009-03-09 8 views
1

私は、同じページにあるGridViewのサマリーとして機能するコントロールを持つaspxページを持っています。ページがロードされると、サマリーコントロールが作成され、リンクが動的に作成され、イベントハンドラがアタッチされます。以下はスニペットです:何かをする前に、コントロールで動的に作成されたリンクを2回クリックする必要がありますか?

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

LoadSummaries()は、GridViewのDataSetをループしてリンクを作成します。ここではそれらに私がリンクを作成し、添付していますかのスニペットとイベントハンドラです:

LinkButton lb = new LinkButton(); 
lb.Text = "Dynamic Text goes here"; 
lb.Click += new System.EventHandler(this.Search); 
lb.CommandName = "CommandName"; 
lb.CommandArgument = "CommandArgument"; 

私はページを実行すると、それは罰金のすべてをロードし、それはに入るために、私はリンクを二回クリックする必要があります検索方法。最初のクリックで、ページはリロードされますが、検索方法には入りません。 2回目のクリックでは、検索方法に入ります。

最初のクリックで実際にイベントハンドラをリンクボタンにバインドしていたのは興味深かったですが、これはPage_Loadで発生しているため、ページがロードされるとLoadSummariesが呼び出され、イベントはリンクボタンに表示されるので、なぜ2回クリックする必要があるのか​​分かりません。

+0

スニペットを追加して、ページへのリンクを追加する方法を教えてください。私はあなたのコードを試して、それはうまく動作します。 – Canavar

+0

それは問題であるか、他の情報が必要ですか? – Xaisoft

答えて

3

あなたのページにコントロールを注入しているかもしれないページ上の複雑なコントロールを使用していますか?

ページにコントロールを注入するライブラリの特定のコントロールを持つページでこの問題が発生しました。私はこれを行うカレンダーコントロールを使用しています。私のコードでコントロールが構築されたとき、コントロールIDはすべてうまく見えましたが、レンダリングの直前に、ツールキットコントロールが新しいコントロールを注入していました。つまり、リンクボタンのポストバックURLは、コントロールIDですが、サーバーは異なるコントロールIDを持つべきだと考えました。

これにより、イベントハンドラが最初のポストバックのコントロールに一致しないため、イベントが発生しませんでした。しかし、2回目はコントロールがすでに注入されていたので、リンクボタンにポストバックURLに新しいコントロールIDがあるため、イベントが発生する可能性があります。

解決策1: 問題の原因となる制御を取り除いてください。残念ながら、必ずしもオプションではありません。私は私の場合にこれをすることができませんでした。

解決策2: 通常のリンクを使用してLinkBut​​tonを削除します。あなたのイベントハンドラがそのページになければならない場合、動作しないかもしれません。

解決策3: 他のコントロールによって変更されないIDを指定します。 (これはXaisoftのソリューションでした)

+0

はい、ページ上にいくつかのコントロールがあります。私は動的に作成されたリンクボタンのIDを特定しましたが、今は正常に動作しているようです。コントロールのIDを指定してポストバックURLを変更しない方法の例を教えてください。ありがとう。 – Xaisoft

2

ジェイは正しいです。コントロールにIDを割り当てていないので、ポストバックのページで何かが変化している可能性があります。つまり、イベントをコントロールにリンクすることはできません。

ちなみに、ページレイアウトを変更した場合、UI統合テスト(Seleniumベースのテストスイートなど)が中断されるため、IDをコントロールに割り当てないことは理論的には悪いことです。

+0

私はIDを割り当てていないとき、そして私がしているときに実際に何が起こっているのか分かりますか?ページソースを表示するだけですか? – Xaisoft

+0

はい。あなたがそれらを指定しなければ、ASP.NetはコントロールIDを自動的に生成します。自動的に生成されるIDは、親コントロールに追加される順序に基づいています。作成順序を変更した場合(他のコントロールを挿入または削除するなど)、IDは異なります。 – womp

関連する問題