在WebForm中,可以使用反射将业务对象绑定到 ASP.NET 窗体控件。最近做Winform项目,也参考WebForm中的代码实现同样的功能。
Winform没有提供类似WebForm中的FindControl方法,我于是用遍历控件的方式,写了一个类似WebForm中的这个方法,考虑到Winform中的很多控件放在Label、TabControl中,方法采用了递归的方式。
Winform和Winform的控件也有些区别,如在Winform中,DateTimePicker取值是用Value属性,在WebForm中使用SelectDate属性,在Winform中,有NumericUpDown控件,取值也是用Value属性,因此,具体绑定方式上也和WebForm中有些区别。
////代码如下:
using System;
using System.Windows.Forms;
using System.Reflection;
using System.Collections;
namespace BindTest
{
public sealed class FormBinding
{
/// <summary>
/// 将业务对象绑定到窗体或控件容器
/// </summary>
/// <param name="obj">业务对象</param>
/// <param name="container">窗体或控件容器</param>
public static void BindObjectToControls(object obj, Control container)
{
if (obj == null) return;
Type objType = obj.GetType();
PropertyInfo[] objPropertiesArray = objType.GetProperties();
foreach (PropertyInfo objProperty in objPropertiesArray)
{
Control control = FindControl(container, objProperty.Name);
if (control == null) continue;
if (control is DateTimePicker)
{
DateTimePicker dateTimePicker = (DateTimePicker)control;
dateTimePicker.Value = (DateTime)objProperty.GetValue(obj, null);
}
else
{
//获取控件的属性
Type controlType = control.GetType();
PropertyInfo[] controlPropertiesArray = controlType.GetProperties();
//通用属性
bool success = false;
success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "Checked", typeof(bool));
if (!success)
success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "Value", typeof(String));
if (!success)
success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "Text", typeof(String));
if (!success)
success = FindAndSetControlProperty(obj, objProperty, control, controlPropertiesArray, "SelectedValue", typeof(String));
}
}
}
/// <summary>
/// 根据控件名找出容器中的控件,考虑有些控件放在窗体的容器中,采用了递归查找。
/// </summary>
/// <param name="container">控件容器</param>
/// <param name="controlName">控件名称</param>
/// <returns></returns>
private static Control FindControl(Control container, string controlName)
{
Control findControl = null;
foreach(Control control in container.Controls)
{
if (control.Controls.Count == 0)
{
if (control.Name == controlName)
{
findControl = control;
break;
}
}
else
{
findControl = FindControl(control, controlName);
}
}
return findControl;
}
/// <summary>
/// 设置控件的值
/// </summary>
/// <param name="obj"></param>
/// <param name="objProperty"></param>
/// <param name="control"></param>
/// <param name="controlPropertiesArray"></param>
/// <param name="propertyName"></param>
/// <param name="type"></param>
/// <returns></returns>
private static bool FindAndSetControlProperty(object obj, PropertyInfo objProperty, Control control, PropertyInfo[] controlPropertiesArray, string propertyName, Type type)
{
foreach (PropertyInfo controlProperty in controlPropertiesArray)
{
if (controlProperty.Name == propertyName && controlProperty.PropertyType == type)
{
controlProperty.SetValue(control, Convert.ChangeType(objProperty.GetValue(obj, null), type), null);
return true;
}
}
return false;
}
public static void BindControlsToObject(object obj, Control container)
{
if (obj == null) return;
//获取业务对象的属性
Type objType = obj.GetType();
PropertyInfo[] objPropertiesArray = objType.GetProperties();
foreach (PropertyInfo objProperty in objPropertiesArray)
{
Control control = FindControl(container, objProperty.Name);
if (control == null) continue;
if (control is DateTimePicker)
{
DateTimePicker dateTimePicker = (DateTimePicker)control;
objProperty.SetValue(obj, Convert.ChangeType(dateTimePicker.Value, objProperty.PropertyType), null);
}
else
{
Type controlType = control.GetType();
PropertyInfo[] controlPropertiesArray = controlType.GetProperties();
bool success = false;
success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "Checked", typeof(bool));
if (!success)
success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "Value", typeof(String));
if (!success)
success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "Text", typeof(String));
if (!success)
success = FindAndGetControlProperty(obj, objProperty, control, controlPropertiesArray, "SelectedValue", typeof(String));
}
}
}
private static bool FindAndGetControlProperty(object obj, PropertyInfo objProperty, Control control, PropertyInfo[] controlPropertiesArray, string propertyName, Type type)
{
// 在整个控件属性中进行迭代
foreach (PropertyInfo controlProperty in controlPropertiesArray)
{
// 检查匹配的名称和类型
if (controlProperty.Name == "Text" && controlProperty.PropertyType == typeof(String))
{
// 将控件的属性设置为
// 业务对象属性值
try
{
objProperty.SetValue(obj, Convert.ChangeType(controlProperty.GetValue(control, null), objProperty.PropertyType), null);
return true;
}
catch
{
// 无法将来自窗体控件
// 的数据转换为
// objProperty.PropertyType
return false;
}
}
}
return true;
}
}
}
//使用方法:
//业务对象:
public class Model
{
public Model()
{
}
private string test1;
private DateTime test2;
private string test3;
public string Test1
{
set { test1 = value; }
get { return test1; }
}
public DateTime Test2
{
set { test2 = value; }
get { return test2; }
}
public string Test3
{
set { test3 = value; }
get { return test3; }
}
}
在一个Winform中,放两个TextBox控件,一个DateTimePicker控件,一个Panel控件,分别命名位Test1、Test2、Test3,其中把Text3控件放在Panel1中。
将业务对象绑定到窗体:
Model model = new Model();
model.Test1 = "Hello,World!";
model.Test2 = DateTime.Now.AddMonths(-2);
model.Test3 = "Nice to meet u!";
FormBinding.BindObjectToControls(model, this);
将窗体绑定到业务对象:
Model model = new Model();
FormBinding.BindControlsToObject(model, this);
MessageBox.Show(model.Test1 + " " + model.Test2.ToShortDateString() + " " + model.Test3);
分享到:
相关推荐
本文将详细探讨如何使用PageSetupDialog、PrintDialog、PrintDocument和PrintPreviewDialog类来实现窗体及窗体控件的打印。 首先,让我们了解这些类的作用: 1. **PageSetupDialog**: 这个对话框允许用户设置页面...
WinForm中comboBox控件数据绑定是许多开发者需要掌握的技巧,本文将详细介绍WinForm中comboBox控件数据绑定的实现方法,并结合实例形式分析了WinForm实现comboBox控件数据绑定的常用方法与相关操作技巧。 WinForm中...
在WinForm的Update或Timer事件中,我们可以调用VideoCapture的Read方法来获取每一帧的图像,然后将其转换为Bitmap对象,赋值给pictureBox的Image属性。以下是示例代码: ```csharp private void timer1_Tick(object...
例如,当一个窗体上的按钮被点击时,我们可以创建一个委托实例,将该按钮的事件处理程序绑定到一个方法,这个方法会执行对另一个窗体的操作。 接下来,我们讨论“回调”。回调是一种设计模式,其中我们传递一个方法...
在C# WinForm开发中,动态生成控件是一项常见的需求,尤其在设计用户自定义界面或者数据绑定场景下。本文将深入探讨如何在WinForm应用中动态创建Label控件,并结合实际示例来阐述相关技术点。 首先,我们需要了解...
在子窗体中响应事件,可以调用主窗体的公开方法,实现对主窗体控件的操作。 6. **委托与事件处理**:在不同窗体间传递事件,可以使用委托作为方法的引用。同时,窗体间的通信可以通过定义自定义事件和事件处理程序...
在自定义的窗体类中,可以创建一个Bitmap对象,将画布转移到这个内存图上,然后一次性将内存图绘制到屏幕上,减少闪烁。 ```csharp public class DoubleBufferedForm : Form { protected override void ...
- **控件引用**:在创建子窗体时,可以将父窗体的对象传递给子窗体,使子窗体可以直接访问父窗体的公共属性和方法。例如,子窗体可以调用父窗体的`RefreshData()`方法来刷新数据。 - **委托和事件**:如果不想直接...
3. 添加ElementHost到Winform:在Winform设计器中,从工具箱中拖放一个ElementHost控件到窗体上。 4. 配置ElementHost:在代码中,你需要为ElementHost实例设置`Child`属性,使其指向你创建的WPF控件。例如: ```...
以下将详细介绍如何在C# WinForm中创建用户控件、使用用户控件以及在窗体与用户控件之间传递值。 1. 创建用户控件(UserControl): 在Visual Studio中,可以通过"添加新项"菜单选择"Windows Forms 控件库"来创建一个...
在C# Winform应用开发中,窗体间的切换是一个常见的需求,这通常涉及到多个窗体之间的交互和数据管理。本示例"SwitchOver"演示了如何在一个主窗体中通过按钮来平滑地在三个子窗体之间进行切换,同时确保在切换过程中...
最后,为了使这个自定义控件易于在项目中使用,我们可以将其打包成一个用户控件库,这样在其他WinForm项目中只需引用这个库,即可在设计时拖放控件到窗体上,并进行属性配置和事件绑定。 总的来说,创建"winform...
2. 添加控件:从工具箱中,可以将按钮、文本框、标签、列表视图等控件拖放到窗体上,为用户提供交互界面。 3. 设置属性:在属性窗口中,可以修改控件的各种属性,如尺寸、位置、颜色、字体等。 4. 编写事件处理代码...
这个控件的设计原则是简单易用,开发者只需一行代码就能快速地将其集成到自己的Winform应用中。这极大地简化了开发流程,节省了编码时间,同时降低了出错的可能性。在处理大量数据或进行后台运算时,这种控件尤其...
- **初始化控件**:在WinForm窗体的构造函数或Load事件中创建并设置dxDataGrid对象。 - **数据绑定**:将数据源绑定到控件,例如`dxDataGrid.DataSource = myDataTable;` - **设置分页属性**:如`dxDataGrid....
- 将`Process`对象与WinForm的子窗体关联,通常需要自定义窗体控件,比如`UserControl`,并在其中嵌入`Process`的输出。 3. **嵌入子窗体** - 创建一个自定义的用户控件(`UserControl`),在这个控件内部承载`...
尽量将这些工作放在控件初始化或数据绑定阶段完成,然后在OnPaint中简单地绘制结果。 "控件重绘 C# WinForm控件美化扩展系列之TabControl"可能还包括了一些示例代码,如在压缩包中的两个RAR文件。通过学习和分析...
6. **使用用户控件**:在其他WinForm窗体中,可以通过设计视图或代码方式将用户控件拖放到窗体上,然后在窗体的代码中引用用户控件的属性和方法,与之交互。 实现导入导出功能通常涉及文件操作,如读写XML或CSV文件...
7. **数据绑定**:WinForm允许控件与数据源进行绑定,例如将数据库字段绑定到文本框,或者将列表框的数据源设置为数组或集合。 8. **自定义控件**:开发者可以通过继承现有控件并添加新功能,创建自己的自定义控件...
本篇将详细探讨C# WinForm控件的使用,包括它们的功能、属性、事件和方法,以及如何在实际项目中应用。 一、WinForm控件基础 WinForm控件是构成用户界面的基本元素,如按钮、文本框、标签等。这些控件可以直观地拖...