技术开发 频道

在剪贴板上保存自定义对象

IT168 技术文档】

    剪贴板上一般放置的都是由DataFormats类定义好的数据类型,其实我们也可以定义自己的数据类型。 创建自己写的类的对象,再将该对象在程序与剪贴板之间传来传去,挺有意思。

    代码中已有注释,不再做说明。

    先创建一个类,用作表达数据信息:

using System; namespace SimpleTest { /**//// <summary> /// UserInfo 的摘要说明。 /// </summary> [Serializable]//必须给此类加上这个标志,表明此类是可以序列化的(即可以将此类创建的对象转换为数据流) public class UserInfo { public UserInfo() { // // TODO: 在此处添加构造函数逻辑 // } public string Name = "余智学"; public bool IsMan = true; public int Age = 20; public DateTime Birthday = new DateTime(1986,1,1); } }

    实现功能的窗体:

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.IO; using System.Data.SqlClient; namespace SimpleTest { /**//// <summary> /// Form1 的摘要说明。 /// </summary> public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.Button btnCopyToClipboard; private System.Windows.Forms.Button btnPasteFromClipboard; private System.Windows.Forms.TextBox txtName; private System.Windows.Forms.RadioButton rdoIsMan; private System.Windows.Forms.NumericUpDown numAge; private System.Windows.Forms.DateTimePicker dtpBirthday; private System.Windows.Forms.RadioButton rdoIsWoman; /**//// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.Container components = null; public Form1() { // // Windows 窗体设计器支持所必需的 // InitializeComponent(); // // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // } /**//// <summary> /// 清理所有正在使用的资源。 /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } Windows 窗体设计器生成的代码Windows 窗体设计器生成的代码 /**//// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } /**//// <summary> /// 根据窗体上各个控件的值创建UserInfo对象 /// </summary> /// <returns></returns> private UserInfo CreateObj() { UserInfo obj = new UserInfo(); obj.Name = this.txtName.Text; obj.IsMan = this.rdoIsMan.Checked; obj.Age = (int)this.numAge.Value; obj.Birthday = this.dtpBirthday.Value; return obj; } /**//// <summary> /// 在窗体上显示UserInfo对象 /// </summary> /// <param name="obj"></param> private void ShowObjInForm(UserInfo obj) { if(obj != null) { this.txtName.Text = obj.Name; this.rdoIsMan.Checked = obj.IsMan; this.rdoIsWoman.Checked = !obj.IsMan; this.numAge.Value = obj.Age; this.dtpBirthday.Value = obj.Birthday; } } private void btnCopyToClipboard_Click(object sender, System.EventArgs e) { UserInfo obj = this.CreateObj(); //申请注册一个新的Clipboard数据格式 DataFormats.Format UserInfoFormat = DataFormats.GetFormat("UserInfo"); //将对象包容到DataObj中 IDataObject myDataObj = new DataObject(obj); //复制到剪贴板,并在退出程序时仍然保存 Clipboard.SetDataObject(myDataObj,true); MessageBox.Show("对象已复制到剪贴板!"); } private void btnPasteFromClipboard_Click(object sender, System.EventArgs e) { //从剪贴板中提取对象 IDataObject retObj = Clipboard.GetDataObject(); //判断剪贴板上的数据是否是UserInfo类型的 if(retObj.GetDataPresent("SimpleTest.UserInfo")) { //获取UserInfo对象 UserInfo obj = retObj.GetData("SimpleTest.UserInfo") as UserInfo; //在窗体上显示对象 this.ShowObjInForm(obj); } else { MessageBox.Show("不支持的数据格式!"); } } private void Form1_Load(object sender, System.EventArgs e) { ShowObjInForm(new UserInfo()); } } }




0
相关文章