剪贴板上一般放置的都是由DataFormats类定义好的数据类型,其实我们也可以定义自己的数据类型。
创建自己写的类的对象,再将该对象在程序与剪贴板之间传来传去,挺有意思哦
代码中已有注释,不再做说明。
先创建一个类,用作表达数据信息:
1using System;
2
3namespace SimpleTest
4{
5 /// <summary>
6 /// UserInfo 的摘要说明。
7 /// </summary>
8 [Serializable]//必须给此类加上这个标志,表明此类是可以序列化的(即可以将此类创建的对象转换为数据流)
9 public class UserInfo
10 {
11 public UserInfo()
12 {
13 //
14 // TODO: 在此处添加构造函数逻辑
15 //
16 }
17 public string Name = "余智学";
18 public bool IsMan = true;
19 public int Age = 20;
20 public DateTime Birthday = new DateTime(1986,1,1);
21 }
22}
23
24
实现功能的窗体:
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 窗体设计器生成的代码
/// <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());
}
}
}