网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > ASP.net > 正文

使用反射将业务对象绑定到 ASP.NET 窗体控件

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/13
container.FindControl(objProperty.Name);
  if (control != null) {
  // 处理控件
  }
  }
  }
  }
  
  在以上代码中,方法 BindObjectsToControls 接受了业务对象 obj 和一个容器控件。容器控件通常是当前 Web 窗体的 Page 对象。如果所用版本是会在运行时更改控件嵌套顺序的 ASP.NET 1.x MasterPages,您将需要指定窗体控件所在的 Content 控件。这是在 ASP.NET 1.x 中,FindControl 方法对嵌套控件和命名容器的处理方式导致的。
  
  在以上代码中,我们获取了业务对象的 Type,然后使用该 Type 来获取 PropertyInfo 对象的数组。每个 PropertyInfo 对象都包含关于业务对象属性以及从业务对象获取和设置值的能力的信息。我们使用 foreach 循环检查具有与业务对象属性名 (PropertyInfo.Name) 对应的 ID 属性的 ASP.NET 控件的容器。如果找到控件,则尝试将属性值绑定到该控件。
  
  将对象属性值绑定到控件
  
  过程中的大部分操作是在此阶段执行的。我们需要用对象的属性值来填充找到的控件。一种实现方法是为每种控件类型创建一个 if else 语句。派生自 ListControl(DropDownList、RadioButtonList、CheckBoxList 和 ListBox)的所有控件都具有可以统一访问的公用接口,所以可以将它们编组在一起。如果找到的控件是 ListControl,我们可以将其作为 ListControl 进行转换,然后设置选定项:
  
  Control control = container.FindControl(objProperty.Name);
  if (control != null) {
  if (control is ListControl) {
  ListControl listControl = (ListControl) control;
  string propertyValue = objProperty.GetValue(obj,
  null).ToString();
  ListItem listItem =
  listControl.Items.FindByValue(propertyValue);
  if (listItem != null) listItem.Selected = true;
  } else {
  // 处理其他控件类型
  }
  }
  
  不幸的是,其他控件类型并不从父类中派生。以下几个公用控件都具有 .Text 字符串属性:TextBox、Literal 和 Label。但该属性不是从公用父类中派生出来的,所以需要分别转换每种控件类型。我们还需要转换其他控件类型,例如 Calendar 控件,以便使用适当的属性(在 Calendar 的例子中,是 SelectedDate 属性)。要包含所有标准的 ASP.NET 窗体控件,并访问窗体控件的正确属性并不需要太多的代码行。
  
  if (control is ListControl) {
  ListControl listControl = (ListControl) control;
  string propertyValue = objProperty.GetValue(obj,
  null).ToString();
  ListItem listItem = listControl.Items.FindByValue(propertyValue);
  if (listItem != null) listItem.Selected = true;
  } else if (control is CheckBox) {
  if (objProperty.PropertyType == typeof(bool))
  ((CheckBox) control).Checked = (bool)
  objProperty.GetValue(obj, null);
  } else if (control is Calendar) {
  if (objProperty.PropertyType == typeof(DateTime))
  ((Calendar) control).SelectedDate = (DateTime)
  objProperty.GetValue(obj, null);
  } else if (control is TextBox) {
  ((TextBox) control).Text = objProperty.GetValue(obj,
  null).ToString();
  } else if (control is Literal)(
  // 等等。还可用于标签等属性。
  }
  
  此方法完整地涵盖了标准的 ASP.NET 1.x 控件。从这个角度来看,我们拥有了功能齐全的 BindObjectToControls 方法。但在起作用的同时,此方法的应用范围会受到限制,因为它仅考虑内置的 ASP.NET 1.x 控件。如果要支持新的 ASP.NET 2.0 控件,或者要使用任何第三方控件,我们必须在

网学推荐

免费论文

原创论文

设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号