2009-02-27 43 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); 
    } 
}