C# RichTextBox 一个简单而又复杂的【复制粘贴】问题 WeifenLuo.WinFormsUIWinFormsUI.DockingC# 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 复制与粘贴:::: this.rtbox.riBox.Copy(); 与 this.rtbox.riBox.Paste(); rtbox 为Form3 riBox 为关联Form3 的 RichTextBox 控制 //关联Form3 的 RichTextBox 控制 /// <summary> 获取 RichTextBox 的操作权限<para> <para> /// 关联 RichTextBox </para></para></summary> public RichTextBox riBox { get { return this.txtInput; } set { this.txtInput = value; } } // Form1 复制粘贴点击事件(粘贴部分,此事件分 文件菜单/工具栏/右键菜单 点击事件) private void MenuEdit_Copy_Click(object sender, EventArgs e) { this.rtbox.riBox.Copy();//复制 } private void MenuEdit_Paste_Click(object sender, EventArgs e) { this.rtbox.riBox.Paste();//粘贴 mxdrsave.FbSave = false;//粘贴后,显示文件为未保存 }// Form1 中的委托 treev 为Form2//这里的委托执行的是点击 〖文件〗 『节点』即加载内容到 RichTextBox 中treev.LoadFind += new Acding(treev_LoadFind); //执行委托 void treev_LoadFind(string str) { RichTextBox rbox = rtbox.riBox; if (mxdrsave.FbSave) //判断文件是否已保存 { rbox.Clear(); mxdrsave.openFiles(this, str); //打开节点文件 SnuMs();//获取行列 } else { mxdrsave.AskDialog(this, rbox);//如果文件未保存,通知保存 if (mxdrsave.FbSave) { rbox.Clear(); mxdrsave.openFiles(this, str); SnuMs(); } } } /// <summary> 为TreeView节点打开文件 </summary> /// <param name="form">窗口</param> /// <param name="path">文件名(含路径)</param> public void openFiles(Form form,string path) { FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None); StreamReader sr = new StreamReader(fs, Encoding.Default); this.readFile(sr.ReadToEnd()); //委托事件 this.txtName = Path.GetFileName(path); //获取文件名 this.filePath = path; string str = Directory.GetParent(filePath).ToString(); string strs = Path.GetExtension(filePath); this.txtName = Path.GetFileNameWithoutExtension(path); sr.Close(); fs.Close(); this.FbOpen = true; this.FbSave = true; this.FbOpens = true; form.Text = string.Format("『{0}』{2}〖Mxdr记事本〗 - 所在目录:[{1}]", this.txtName, str, strs); }是否可以用另一种方式去判断已经粘贴了内容呢??? // this.readFile(sr.ReadToEnd()); //委托事件的委托参数 sr.ReadToEnd() 读取文件流 void mxdrsave_readFile(string str) { RichTextBox rbox = rtbox.riBox; rbox.Text = str; FbRiSave = false; mxdrsave.FbSave = true; } 用下面的方法暂时解决了,但不知道是否会存在BUG /// <summary> 用 "剪贴板"的内容替换文本框中当前选定的内容 </summary> /// <param name="rbox">RichTextBox</param> public static void Pastes(RichTextBox rbox) { string str = string.Empty; // GetDataObject检索当前剪贴板上的数据 IDataObject iData = Clipboard.GetDataObject(); // 将数据与指定的格式进行匹配,返回bool if (iData.GetDataPresent(DataFormats.UnicodeText)) // GetData检索数据并指定一个格式 rbox.SelectedText = (string)iData.GetData(DataFormats.UnicodeText); else MessageBox.Show("目前剪贴板中数据不可转换为文本", "错误"); } 从楼主的解决办法中可以证明一件事,剪贴板中的内容绝不是简单的文字,而是一组对象.每个对象都有一个类型,可能是UNCODE文本,HTML,其他甚至是自定义的.从IE浏览器或者EXCEL中复制一段内容,分别粘贴到 记事本和WORD中,样子是不一样的,原因就在于此. 看了楼主写的代码,我就觉得楼主是书看多了还是怎么的,例如:this.rtbox.riBox.Copy(); 与 this.rtbox.riBox.Paste(); this非要写么,而且你这命名看了就叫人蛋痛,代码要简捷,命名要使人一看就明白。 谢谢提醒!!!命名已改正。现在有点头痛,用 DataFormats.UnicodeText 粘贴后变成 RichTextBox 默认书写格式(字号,粗体,样式都是),如果用其他格式,中文显示的都是乱码。 /// <summary> 用 "剪贴板"的内容替换文本框中当前选定的内容 </summary> /// <param name="rbox">RichTextBox</param> public static void Pastes(RichTextBox rbox) { string str = string.Empty; // GetDataObject检索当前剪贴板上的数据 IDataObject iData = Clipboard.GetDataObject(); // 将数据与指定的格式进行匹配,返回bool if (iData.GetDataPresent(DataFormats.UnicodeText)) // GetData检索数据并指定一个格式 rbox.SelectedText = (string)iData.GetData(DataFormats.UnicodeText); else MessageBox.Show("目前剪贴板中数据不可转换为文本", "错误"); } 一般情况下,能够粘贴到记事本中就能粘贴到richtextbox控件中,该控件支持多种格式的文本类型,属性里可以设置。 RichTextBox控件中替换文本文字private void button1_Click(object sender, EventArgs e) { if (this.richTextBox1.SelectedText.ToString() == "") { MessageBox.Show(//弹出提示信息 "请选重要替换的文本", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { this.richTextBox1.SelectedText = txt_Content.Text;//替换选中的文本 } } C# 从UseControl继承的基类不能继续派生 IDictionary 序列化错误 [高分讨论] 如何用 webbrowser 模拟单击 Yahoo 新版邮箱的 收信按钮 SubItems问题 请教出现这个错误该怎么办?“试图运行项目时出错:无法启动调试。占位程序接收到错误数据。” 求助,集合已修改,枚举操作可能不会执行?? tabControl页面重用 如何修改XML中的注释 关于用C#创建实例的问题,请帮忙 我死活找不到C# DIRECTX 9.0 2D的开发教程和例子谁有啊? 请教各位前辈有关WPF相关问题,谢谢!! 嵌套类可以被重写吗?
/// <summary> 获取 RichTextBox 的操作权限<para> <para>
/// 关联 RichTextBox </para></para></summary>
public RichTextBox riBox
{
get { return this.txtInput; }
set { this.txtInput = value; }
}
// Form1 复制粘贴点击事件(粘贴部分,此事件分 文件菜单/工具栏/右键菜单 点击事件)
private void MenuEdit_Copy_Click(object sender, EventArgs e)
{
this.rtbox.riBox.Copy();//复制
} private void MenuEdit_Paste_Click(object sender, EventArgs e)
{
this.rtbox.riBox.Paste();//粘贴
mxdrsave.FbSave = false;//粘贴后,显示文件为未保存
}
// Form1 中的委托 treev 为Form2
//这里的委托执行的是点击 〖文件〗 『节点』即加载内容到 RichTextBox 中
treev.LoadFind += new Acding(treev_LoadFind); //执行委托
void treev_LoadFind(string str)
{
RichTextBox rbox = rtbox.riBox;
if (mxdrsave.FbSave) //判断文件是否已保存
{
rbox.Clear();
mxdrsave.openFiles(this, str); //打开节点文件
SnuMs();//获取行列
}
else
{
mxdrsave.AskDialog(this, rbox);//如果文件未保存,通知保存
if (mxdrsave.FbSave)
{
rbox.Clear();
mxdrsave.openFiles(this, str);
SnuMs();
}
}
}
/// <summary> 为TreeView节点打开文件 </summary>
/// <param name="form">窗口</param>
/// <param name="path">文件名(含路径)</param>
public void openFiles(Form form,string path)
{
FileStream fs = new FileStream(path,
FileMode.Open, FileAccess.Read, FileShare.None);
StreamReader sr = new StreamReader(fs, Encoding.Default);
this.readFile(sr.ReadToEnd()); //委托事件
this.txtName = Path.GetFileName(path); //获取文件名
this.filePath = path;
string str = Directory.GetParent(filePath).ToString();
string strs = Path.GetExtension(filePath);
this.txtName = Path.GetFileNameWithoutExtension(path);
sr.Close();
fs.Close(); this.FbOpen = true; this.FbSave = true; this.FbOpens = true;
form.Text = string.Format("『{0}』{2}〖Mxdr记事本〗 - 所在目录:[{1}]", this.txtName, str, strs);
}是否可以用另一种方式去判断已经粘贴了内容呢???
// this.readFile(sr.ReadToEnd()); //委托事件的委托参数 sr.ReadToEnd() 读取文件流
void mxdrsave_readFile(string str)
{
RichTextBox rbox = rtbox.riBox;
rbox.Text = str;
FbRiSave = false;
mxdrsave.FbSave = true;
}
/// <param name="rbox">RichTextBox</param>
public static void Pastes(RichTextBox rbox)
{
string str = string.Empty;
// GetDataObject检索当前剪贴板上的数据
IDataObject iData = Clipboard.GetDataObject(); // 将数据与指定的格式进行匹配,返回bool
if (iData.GetDataPresent(DataFormats.UnicodeText))
// GetData检索数据并指定一个格式
rbox.SelectedText = (string)iData.GetData(DataFormats.UnicodeText);
else
MessageBox.Show("目前剪贴板中数据不可转换为文本", "错误"); }
每个对象都有一个类型,可能是UNCODE文本,HTML,其他甚至是自定义的.
从IE浏览器或者EXCEL中复制一段内容,分别粘贴到 记事本和WORD中,样子是不一样的,原因就在于此.
this非要写么,而且你这命名看了就叫人蛋痛,代码要简捷,命名要使人一看就明白。
如果用其他格式,中文显示的都是乱码。
/// <summary> 用 "剪贴板"的内容替换文本框中当前选定的内容 </summary>
/// <param name="rbox">RichTextBox</param>
public static void Pastes(RichTextBox rbox)
{
string str = string.Empty;
// GetDataObject检索当前剪贴板上的数据
IDataObject iData = Clipboard.GetDataObject();
// 将数据与指定的格式进行匹配,返回bool
if (iData.GetDataPresent(DataFormats.UnicodeText))
// GetData检索数据并指定一个格式
rbox.SelectedText = (string)iData.GetData(DataFormats.UnicodeText);
else
MessageBox.Show("目前剪贴板中数据不可转换为文本", "错误");
}
private void button1_Click(object sender, EventArgs e)
{
if (this.richTextBox1.SelectedText.ToString() == "")
{
MessageBox.Show(//弹出提示信息
"请选重要替换的文本", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
this.richTextBox1.SelectedText = txt_Content.Text;//替换选中的文本
}
}