【发布时间】:2017-03-02 01:22:02
【问题描述】:
当文本被粘贴到 RichTextBox 时,是否有某种方法可以检测或触发事件?或者也许已经有某种事件在粘贴文本时触发?顺便说一下,这是 Winforms C#。
【问题讨论】:
标签: c# winforms richtextbox copy-paste
当文本被粘贴到 RichTextBox 时,是否有某种方法可以检测或触发事件?或者也许已经有某种事件在粘贴文本时触发?顺便说一下,这是 Winforms C#。
【问题讨论】:
标签: c# winforms richtextbox copy-paste
因为不是所有人都可以使用 Ctrl+V,而且还有其他方法可以将文本放入文本框中(例如拖放),所以我采用了不同的方法,我将在此处分享,以防其他人看到寻求解决方案。
我所做的是在我的班级中创建一个字段:
int _lastPosition = 0;
在 TextChanged() 事件中,我添加了以下内容:
if (SelectionStart - _lastPosition > 2)
{
// Text was pasted into text box
}
_lastPosition = SelectionStart;
我假设如果一次在文本框中输入了超过 2 个字符,那么文本肯定已经被粘贴了,因为其他人怎么能一次输入超过 2 个字符呢?所以无论如何,这对我有用。感谢所有试图提供帮助的人。
【讨论】:
Icemanminds 的答案无法正常工作,这确实会在您粘贴但有副作用时向您显示。
如果您这样做,您还将在文本更改中输入 if 块,并带有一个空文本框 1.粘贴至少两行文字 2. 用箭头键上到第一行,按空格然后退格 3.用箭头键回到底线并按回车 当粘贴没有发生时,您现在会收到通知。
编辑:这是解决问题的方法
代码:
protected override void OnSelectionChanged(EventArgs e)
{
base.OnSelectionChanged(e);
int cavetOffset = SelectionStart - m_nLastCavetPos;
int sizeOffset = Text.Length - m_nLastKnownSize;
if (sizeOffset > 0)
{
if (sizeOffset == 1)
Console.WriteLine("Typed \"" + (Text.Substring(SelectionStart - cavetOffset, sizeOffset)) + "\" At Position " + (SelectionStart - cavetOffset));
else if (sizeOffset > 1)
Console.WriteLine("Pasted \"" + (Text.Substring(SelectionStart - cavetOffset, sizeOffset)) + "\" At Position " + (SelectionStart - cavetOffset));
}
else if (sizeOffset == 0)
{
Console.WriteLine("Moved Caret to " + SelectionStart + " From " + m_nLastCavetPos);
}
else
{
if (sizeOffset == -1)
Console.WriteLine("Backspaced at " + (SelectionStart - cavetOffset));
if (sizeOffset < -1)
Console.WriteLine("HiliteDelete at " + ((SelectionStart - cavetOffset)+-sizeOffset) + " deleted " + (-sizeOffset) + " characters");
}
m_nLastKnownSize = Text.Length;
m_nLastCavetPos = SelectionStart;
}
【讨论】:
无论如何,我都不是 C# 专家,事实上,我已经 3 年没有接触该语言了!但是,您可能希望使用 ProcessCmdKey 方法来侦听 CTRL + V。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.71).aspx
【讨论】:
这是另一种类似的方法,用于检测是否发生了更改框中字符数的剪切或粘贴(它不会检测粘贴的字符数是否与突出显示的字符数相同): 首先创建一个类级成员来保存当前长度
private int _LastTextLength = 0;
现在标记用户进入框的长度:
private void txtNoteDetails_Enter(object sender, EventArgs e)
{
_LastTextLength = txtNoteDetails.Text.Length;
}
然后使用 TextChanged 事件:
private void txtNoteDetails_TextChanged(object sender, EventArgs e)
{
if (Math.Abs(txtNoteDetails.Text.Length - _LastTextLength) > 2)
{
//Do your thing
}
}
【讨论】: