2009-02-27 40 views
0

我有一個_Click事件,點擊圖表時觸發。在這個事件中,我立即將發送者鍵入Chart。我經常遵循這個範例,但每次我都會感到噁心。C#_Click事件施放發件人和使用FindControl

在這個特定的實例中,我也馬上跑出去找到相應的UpdatePanel,這樣我就可以向它添加一個動態呈現的GridView。 Chart和UpdatePanel通過具有相似的ID拼湊在一起。圖表和updatepanel都是在運行時動態創建的。

我想知道是否有更好的/首選的方式來實現這種行爲。

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

沒有什麼錯鑄造發件人如果你需要,那就是它的存在。 – 2009-02-27 22:09:59

回答

3

我不知道還有什麼可以做約鑄造發送到圖表(不是使用as等),但也有許多方法來處理相關的控制問題。

  • 一個屬性添加到圖表稱爲 「LinkedPanel」和你的更新面板分配給它

    ,你會看到一個通知圖標採用了類似的模式,在那裏你associate it with a context menu

    我認爲這是非常好的,因爲當它完成正確時,您可以在窗體設計器中分配鏈接的控件。 (當然,它不會與你的動態生成控件幫助)

  • 合併兩組控制到一個單一的 用戶控件(如果控件總是顯示緊挨着對方,這可能是做正確的事)

  • 創建知道這兩個控件對象,並將其處理他們提高

我同意的是,根據名字就覺得這是錯的事件;如果在生產代碼中使用它,我會感到非常尷尬/緊張: - /(如果您是唯一的開發人員,那麼我想這取決於您......)

使用這些其他方法使得由其他開發人員做出的「無辜更改」不太可能開始導致意外的異常。

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_Click。使用添加額外的不必要的開銷和檢查。在事件處理程序中引發 – 2009-02-27 21:15:59

+0

將導致未處理的異常。 – 2009-02-27 21:30:47

0

你所做的一切都沒有錯。但是,你可以通過使用'as'來防止類型轉換錯誤,如下所示。

,如果你想找到如果控制是一個UpdatePanel可以通過使用GetType()方法,這樣做

例如: 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); 
    } 
}