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