C# 单击事件强制转换发送器并使用FindControl

C# 单击事件强制转换发送器并使用FindControl,c#,.net,asp.net,events,C#,.net,Asp.net,Events,我有一个_Click事件,当点击图表时会触发。在这种情况下,我立即将发送者强制转换为类型图表。我经常遵循这种模式,但每次都感到恶心 在这个特定的实例中,我还将立即查找相应的UpdatePanel,以便向其中添加动态渲染的GridView。图表和UpdatePanel通过相似的ID拼凑在一起。图表和updatepanel都是在运行时动态创建的 我想知道是否有更好的/首选的方法来实现这种行为 protected void Chart_Click(object sender, ImageMapEven

我有一个_Click事件,当点击图表时会触发。在这种情况下,我立即将发送者强制转换为类型图表。我经常遵循这种模式,但每次都感到恶心

在这个特定的实例中,我还将立即查找相应的UpdatePanel,以便向其中添加动态渲染的GridView。图表和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);
}
受保护的无效图表\u单击(对象发送者,ImageMapEventArgs e)
{
图表=(图表)发送者;
UpdatePanel up=(UpdatePanel)chart.Parent.FindControl(chart.ID+“up”);
GridView gv=新的GridView();
字典显示字段=
新字典();
//使用ImageMapEventArgs.PostBackValue向displayFields添加数据
//要为字典创建数据。。。
gv.DataSource=显示字段;
gv.DataBind();
ContentTemplateContainer.Controls.Add(gv);
}

我认为将发送者转换为
图表
是安全的,因为您知道它总是一张
图表
。请注意,方法名称为偶数
Chart\u单击

但是,您可以在
图表
标记
属性中保存对
更新面板
的引用。这样就省去了在父对象中搜索姓名的麻烦和风险。如果你经常更换父母或移动配电盘,可能很难维护


但是,如果您100%知道
UpdatePanel
将在那里并正确命名,那么您的方法IMHO不一定是“错误的”。您可能希望在
UpdatePanel.name=
行旁边抛出一条“不要更改此名称”注释,您可以在此处对其进行初始化以确保安全。(顺便说一句,如果你不是唯一一个可以访问你的代码的人,那么100%会立即下降到最多99.9%)

我认为将发送者转换为
图表
是安全的,因为你知道它总是
图表
。请注意,方法名称为偶数
Chart\u单击

但是,您可以在
图表
标记
属性中保存对
更新面板
的引用。这样就省去了在父对象中搜索姓名的麻烦和风险。如果你经常更换父母或移动配电盘,可能很难维护

但是,如果您100%知道
UpdatePanel
将在那里并正确命名,那么您的方法IMHO不一定是“错误的”。您可能希望在
UpdatePanel.name=
行旁边抛出一条“不要更改此名称”注释,您可以在此处对其进行初始化以确保安全。(顺便说一句,如果你不是唯一一个可以访问你的代码的人,那么100%会立即下降到最多99.9%)

使用as代替

如果失败,你的施法将抛出

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

// the rest of your handler.
改用as

如果失败,你的施法将抛出

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

// the rest of your handler.

我不确定将发送者强制转换为图表还能做些什么(除了使用
as
),但有很多方法可以处理相关的控件问题

  • 将属性添加到名为 “LinkedPanel”并为其分配更新面板

    您将看到通知图标中使用的类似模式,其中

    我认为这特别好,因为当它正确完成时,您可以在表单设计器中分配链接控件。(当然,这对动态生成的控件没有帮助)

  • 将两个控件合并为一个控件 UserControl(如果控件总是紧挨着彼此显示,这可能是正确的做法)

  • 创建一个了解这两个控件的对象,并让它处理它们引发的事件

我同意仅仅依靠名字是不对的;如果在生产代码中使用它,我会感到非常尴尬/紧张:-/(如果您是唯一的开发人员,那么我想这取决于您……)


使用这些其他方法可以减少其他开发人员所做的“无害更改”导致意外异常的可能性。

我不确定将发送者强制转换为图表还能做些什么(除了使用
as
),但有许多方法可以处理相关的控件问题

  • 将属性添加到名为 “LinkedPanel”并为其分配更新面板

    您将看到通知图标中使用的类似模式,其中

    我认为这特别好,因为当它正确完成时,您可以在表单设计器中分配链接控件。(当然,这对动态生成的控件没有帮助)

  • 将两个控件合并为一个控件 UserControl(如果控件总是紧挨着彼此显示,这可能是正确的做法)

  • 创建一个了解这两个控件的对象,并让它处理它们引发的事件

我同意仅仅依靠名字是不对的;如果在生产代码中使用它,我会感到非常尴尬/紧张:-/(如果您是唯一的开发人员,那么我想这取决于您……)


使用这些其他方法可以减少其他开发人员所做的“无害更改”导致意外异常的可能性。

您所做的事情并没有什么真正的错误。但您可以通过使用显式转换的“as”instaed防止类型转换错误,如下所示

如果要查找控件是否为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);
   }
}
受保护的无效图表\u单击(对象发送者,ImageMapEventArgs e)
{
图表=(图表)发送者;
控件c=Parent.FindControl(chart.ID+“UP”);
更新面板;
如果(c!=null)
{
up=c作为更新面板**
GridView gv=新的GridV