CSS 控件适配器工具包对事件处理的 Bug 以及修正办法
2006-09-26 18:19
676 查看
今天做一个东西,用了最近刚出来的 CSS 控件适配器工具包,对我的 TreeView 进行定制,结果发现 OnSelectedNodeChanged 事件不工作。
下面是该 TreeView 的简单的 Markup:
<asp:TreeView ID="tvCategories" runat="server"
CssSelectorClass="SimpleEntertainmentTreeView"
ExpandDepth="FullyExpand"
OnSelectedNodeChanged="tvCategories_SelectedNodeChanged"
OnAdaptedSelectedNodeChanged="tvCategories_SelectedNodeChanged"
/>
这个例子我是根据 CSS 控件工具包发布的程序例子模仿来写的。我们注意到,在 TreeView 的属性中,多了几个属性。
这里跟事件相关的是 OnAdaptedSelectedNodeChanged 属性。
追踪代码,发现 CSS 适配器工具包中的类,对被适配的控件的每一个事件,都添加了一个 "OnAdapted" 字样的前缀,然后通过反射找到并调用当前的页面类型中对应的处理方法。其代码如下:
(WebControlAdapterExtender.cs 中)
public void RaiseAdaptedEvent(string eventName, EventArgs e)
{
string attr = "OnAdapted" + eventName;
if ((AdaptedControl != null) &&
(AdaptedControl.Attributes[attr] != null) &&
(AdaptedControl.Attributes[attr].Length > 0))
{
string delegateName = AdaptedControl.Attributes[attr];
MethodInfo method = AdaptedControl.Page.GetType().GetMethod(delegateName);
if (method != null)
{
object[] args = new object[2];
args[0] = AdaptedControl;
args[1] = e;
method.Invoke(AdaptedControl.Page, args);
}
}
}
OK, 看到这里问题明朗了。我们通常在页面中定义的事件处理函数会是 protected 的。比如:
protected void tvCategories_SelectedNodeChanged(object sender, EventArgs e) {
Response.Write("selected");
if (rlistOpType.SelectedValue == "Edit") {
LoadCurrentCategoryData();
}
}
很明显 CSS 控件工具包的这个源码对这个反射调用的写法疏忽了。解决的办法也很简单,将上述代码改成:
public void RaiseAdaptedEvent(string eventName, EventArgs e)
{
string attr = "OnAdapted" + eventName;
if ((AdaptedControl != null) &&
(AdaptedControl.Attributes[attr] != null) &&
(AdaptedControl.Attributes[attr].Length > 0))
{
string delegateName = AdaptedControl.Attributes[attr];
MethodInfo method = AdaptedControl.Page.GetType().GetMethod(delegateName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (method != null)
{
object[] args = new object[2];
args[0] = AdaptedControl;
args[1] = e;
method.Invoke(AdaptedControl.Page, args);
}
}
}
如果你也发现使用了 CSS 控件工具包后,有其他控件的事件不触发的情况,可以这样来解决。
下面是该 TreeView 的简单的 Markup:
<asp:TreeView ID="tvCategories" runat="server"
CssSelectorClass="SimpleEntertainmentTreeView"
ExpandDepth="FullyExpand"
OnSelectedNodeChanged="tvCategories_SelectedNodeChanged"
OnAdaptedSelectedNodeChanged="tvCategories_SelectedNodeChanged"
/>
这个例子我是根据 CSS 控件工具包发布的程序例子模仿来写的。我们注意到,在 TreeView 的属性中,多了几个属性。
这里跟事件相关的是 OnAdaptedSelectedNodeChanged 属性。
追踪代码,发现 CSS 适配器工具包中的类,对被适配的控件的每一个事件,都添加了一个 "OnAdapted" 字样的前缀,然后通过反射找到并调用当前的页面类型中对应的处理方法。其代码如下:
(WebControlAdapterExtender.cs 中)
public void RaiseAdaptedEvent(string eventName, EventArgs e)
{
string attr = "OnAdapted" + eventName;
if ((AdaptedControl != null) &&
(AdaptedControl.Attributes[attr] != null) &&
(AdaptedControl.Attributes[attr].Length > 0))
{
string delegateName = AdaptedControl.Attributes[attr];
MethodInfo method = AdaptedControl.Page.GetType().GetMethod(delegateName);
if (method != null)
{
object[] args = new object[2];
args[0] = AdaptedControl;
args[1] = e;
method.Invoke(AdaptedControl.Page, args);
}
}
}
OK, 看到这里问题明朗了。我们通常在页面中定义的事件处理函数会是 protected 的。比如:
protected void tvCategories_SelectedNodeChanged(object sender, EventArgs e) {
Response.Write("selected");
if (rlistOpType.SelectedValue == "Edit") {
LoadCurrentCategoryData();
}
}
很明显 CSS 控件工具包的这个源码对这个反射调用的写法疏忽了。解决的办法也很简单,将上述代码改成:
public void RaiseAdaptedEvent(string eventName, EventArgs e)
{
string attr = "OnAdapted" + eventName;
if ((AdaptedControl != null) &&
(AdaptedControl.Attributes[attr] != null) &&
(AdaptedControl.Attributes[attr].Length > 0))
{
string delegateName = AdaptedControl.Attributes[attr];
MethodInfo method = AdaptedControl.Page.GetType().GetMethod(delegateName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (method != null)
{
object[] args = new object[2];
args[0] = AdaptedControl;
args[1] = e;
method.Invoke(AdaptedControl.Page, args);
}
}
}
如果你也发现使用了 CSS 控件工具包后,有其他控件的事件不触发的情况,可以这样来解决。
相关文章推荐
- CSS 控件适配器工具包对事件处理的 Bug 以及修正办法
- CSS 控件适配器工具包对事件处理的 Bug 以及修正办法
- 对 CSS 控件适配器处理事件的 Bug 进一步修正
- 对 CSS 控件适配器处理事件的 Bug 进一步修正
- RecycleView的通用适配器BaseQuickAdapter处理item中子控件的点击事件以及cardview卡片阴影
- IE浏览器常见的9个css Bug以及解决办法
- C#动态生成控件以及添加事件处理
- Revit二次开发——加快过滤速度,以及对ElementIntersectsSolidFilter的API的Bug的处理办法
- MasterPage之超严重Bug——将导致窗体内带有回发事件的控件无法回发事件——以及解决方案
- Android基础————UI控件以及控件事件处理详解
- (转)【Android游戏开发之九】(细节处理)触屏事件中的Bug解决方案以及禁止横屏和竖屏切换!
- CSS 控件适配器工具包新版发布
- css hack 再次学习 IE浏览器常见的9个css Bug以及解决办法
- 动态添加dev CheckEdit控件,以及删除。事件处理
- RichEdit控件在处理EM_REPLACESEL消息中有bug?附一种解决办法
- C++ Builder 实现动态生成窗口、控件,以及处理控件事件
- 【Android游戏开发之九】(细节处理)触屏事件中的Bug解决方案以及禁止横屏和竖屏切换!
- IE中伪类:hover的使用及BUG,以及如何在IE6中进行修正(CSS)
- WebBrowser控件处理PreviewKeyDown事件的bug
- C++ Builder 实现动态生成窗口、控件,以及处理控件事件(转载)