2009-02-27 8 views
0

グラフをクリックしたときに発生する_Clickイベントがあります。このイベントでは、送信者は直ちにチャートをタイプするようにキャストしました。私はしばしばこのパラダイムに従っていますが、私がそうするたびに不快感を感じます。C#_Clickイベント送信者のキャストとFindControlの使用

この特定のインスタンスでは、対応するUpdatePanelを見つけるためにすぐに使い果たしているので、動的にレンダリングされたGridViewを追加できます。 ChartとUpdatePanelは、同じようなIDを持つことによって一緒につながっています。チャートと更新パネルの両方は、実行時に動的に作成されます。

このような振る舞いを実装するために、より良い/推奨の方法があるのだろうかと思います。

protected void Chart_Click(object sender, ImageMapEventArgs e) 
{ 
    Chart chart = (Chart)sender; 
    UpdatePanel up = (UpdatePanel)chart.Parent.FindControl(chart.ID + "UP"); 

    GridView gv = new GridView(); 
    Dictionary<string, string> displayFields = 
     new Dictionary<string, string>(); 

    // add data to displayFields by using the ImageMapEventArgs.PostBackValue 
    // to create data for dictionary ... 

    gv.DataSource = displayFields; 
    gv.DataBind(); 
    up.ContentTemplateContainer.Controls.Add(gv); 
} 
+0

を与えますあなたが必要ならば、それがそこにあるのです。 –

答えて

3

私は(asを使用以外)のチャートに、送信者のキャスティングについて行うことができる他に何かわからないんだけど、関連付けられたコントロールの問題に対処するための多くの方法があります。

  • チャートにプロパティを追加します。あなたはあなたassociate it with a context menu通知アイコンで使用される同様のパターンが表示されます

    「LinkedPanel」 と呼ばれ、そこにあなたの更新パネルを割り当てる)

    これがうまくいけば、フォームデザイナーでリンクされたコントロールを割り当てることができます。 (もちろん、それはあなたの動的に生成されたコントロールに役立つことはありません)

  • 単一 ユーザーコントロール(コントロールは常に右隣同士に表示された場合、これを行うには正しいことかもしれません)

  • に両方のコントロールを組み合わせます
  • 私は名前に依存するだけで間違って感じていることに同意するものと両方のコントロールを知っているオブジェクトを作成し、それは彼らが

を上げるイベントを処理持っています。あなたが唯一の開発者なら、それはあなた次第だと思う。)

他のアプローチを使用すると、別の開発者が行った「無邪気な変更」が予想外の例外を引き起こす可能性が低くなります。

+0

チャートにプロパティを追加することは、それが密閉クラスではないことを前提としています。 –

+0

@lc:うん、うまくいけば、それはそうではありません...しかし、そうであれば、取ることができる他のルートがあります。 –

+0

うん。プロパティを追加することは確かに一番きれいな方法です。 –

1

私はあなたが、それは常にChart知っているので、それがChartに送信者をキャストしても安全だと思います。メソッド名はChart_Clickであることに注意してください。

ただし、ChartTagプロパティには、UpdatePanelへの参照を保存することはできます。それは親の名前検索の醜さとリスクを節約します。あなたが常に親を変えたり、パネルを動かしたりすると、維持するのが難しくなるかもしれません。あなたがそこにと適切に名付けになるだろう100%UpdatePanel年代を知っている場合

、しかし、あなたのアプローチの私見と、必ずしも 『間違って』は何もありません。セキュリティのために初期化する場合は、UpdatePanel.Name =行の横に「この名前を変更しない」というコメントをスローするとよいでしょう。あなたがあなたのコードにアクセスできる唯一の人ではない場合は、100%が即座に99.9%まで低下します。

1

代わりに代わりに使用してください。

失敗した場合、キャストがスローされます。

Chart chart = sender as Chart; 
if (chart == null) 
    return; // or do something else 

// the rest of your handler. 
+0

私は投げが適切な応答だと思います。私の本では、Chartを除く誰もChart_Clickを呼び出すべきではありません。 asを使うと余分なオーバーヘッドとチェックが余分に追加される。 –

+0

イベントハンドラをスローすると、処理されない例外が発生します。 –

0

本当に間違ったことはありません。しかし、以下のように明示的キャスティングの 'as' instaedを使用することで、型キャストエラーを防ぐことができます。

あなたがコントロールを使用すると、GetType()メソッドを使用して行うことができUpdatePanelのであれば検索したい場合は

例: sender.GetType().nameは何も悪いことは、鋳造、送信者にありませんあなたのコントロール名

protected void Chart_Click(object sender, ImageMapEventArgs e) 
{ 
    Chart chart = (Chart)sender; 
    control c = Parent.FindControl(chart.ID + "UP"); 
    UpdatePanel up ; 

    if (c != null) 
    { 
     up = c as UpdatePanel;** 


     GridView gv = new GridView(); 
     Dictionary<string, string> displayFields = 
      new Dictionary<string, string>(); 

     // add data to displayFields by using the ImageMapEventArgs.PostBackValue 
     // to create data for dictionary ... 

     gv.DataSource = displayFields; 
     gv.DataBind(); 
     up.ContentTemplateContainer.Controls.Add(gv); 
    } 
} 
関連する問題