[英]Detecting some text has been selected in a textbox
I've implemented a notepad application in c#,all the feaures work perfectly,there is only one thing which I can't implement exactly.there are some menuitems in the edit dropdown menu,but their enabled property must change according to the situation of the textbox,I have a problem with two situations and I'm looking for an event in order to change their enabled property in this event's eventhandler,here is the problem: 我在c#中实现了一个记事本应用程序,所有功能都完美无缺,只有一件事我无法完全实现。编辑下拉菜单中有一些菜单项,但是它们的启用属性必须根据情况而改变文本框,我有两个情况的问题,我正在寻找一个事件,以便在此事件的eventhandler中更改其启用的属性,这是问题所在:
2)When some text is selected in the textbox,delete,copy and paste options should get enabled.how should I detect it?I've tested texchanged event an I've written a condition like the code below but it didn't work,just the clipboard works well: 2)当在文本框中选择了一些文本时,删除,复制和粘贴选项应该被启用。我应该检测它吗?我已经测试了texchanged事件,我写了一个像下面的代码一样的条件但是它不起作用,只是剪贴板运作良好:
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (textBox1.SelectionLength> 0)
button1.Enabled = false;
if (Clipboard.ContainsText())
button2.Enabled = false;
}
How should I solve my problem,by the way I have to use a textbox not a richtextbox. 我应该如何解决我的问题,因为我必须使用文本框而不是richtextbox。 Any suggestions will be appreciated.
任何建议将不胜感激。 Thanks a lot
非常感谢
To find out selection 找出选择
if (textbox1.SelectionLength > 0)
{
}
For clipboard content, use 对于剪贴板内容,请使用
System.Windows.Forms.Clipboard.getText();
Check clipboard content by, 检查剪贴板内容,
IDataObject iData = Clipboard.GetDataObject();
// Is Data Text?
if (iData.GetDataPresent(DataFormats.Text))
label1.Text = (String)iData.GetData(DataFormats.Text);
else
label1.Text = "Data not found.";
This is implemented in the code. 这是在代码中实现的。 You can use it directly as above
您可以像上面一样直接使用它
Most important, don't forget 最重要的是,别忘了
public virtual string SelectedText { get; set; }
This is the complete code with menu item 这是包含菜单项的完整代码
private void Menu_Copy(System.Object sender, System.EventArgs e)
{
// Ensure that text is selected in the text box.
if(textBox1.SelectionLength > 0)
// Copy the selected text to the Clipboard.
textBox1.Copy();
}
private void Menu_Cut(System.Object sender, System.EventArgs e)
{
// Ensure that text is currently selected in the text box.
if(textBox1.SelectedText.Length > 0)
// Cut the selected text in the control and paste it into the Clipboard.
textBox1.Cut();
}
Private void Menu_Paste(System.Object sender, System.EventArgs e)
{
// Determine if there is any text in the Clipboard to paste into the text box.
if(Clipboard.GetDataObject().GetDataPresent(DataFormats.Text))
{
// Determine if any text is selected in the text box.
if(textBox1.SelectionLength > 0)
{
// Ask user if they want to paste over currently selected text.
if(MessageBox.Show("Do you want to paste over current selection?", "Cut Example", MessageBoxButtons.YesNo) == DialogResult.No)
// Move selection to the point after the current selection and paste.
textBox1.SelectionStart = textBox1.SelectionStart + textBox1.SelectionLength;
}
// Paste current text in Clipboard into text box.
textBox1.Paste();
}
}
private void Menu_Undo(System.Object sender, System.EventArgs e)
{
// Determine if last operation can be undone in text box.
if(textBox1.CanUndo == true)
{
// Undo the last operation.
textBox1.Undo();
// Clear the undo buffer to prevent last action from being redone.
textBox1.ClearUndo();
}
}
Worked for me. 为我工作。
private void button2_Click(object sender, EventArgs e)
{
if (textBox1.SelectedText != String.Empty)
{
label1.Text = textBox1.SelectedText;
}
if (Clipboard.ContainsText())
{
label2.Text = Clipboard.GetText();
}
}
Well, in my opinion the easiest way to go with this is to define enabling/disabling method: 嗯,在我看来,最简单的方法是定义启用/禁用方法:
private void editMenuItemOpened(object sender, EventArgs e)
{
//enable copy and cut only if some text is selected
copyMenuItem.Enabled = cutMenuItem.Enabled = textBox1.SelectionLength > 0;
//enable paste only if there's some text in the clipboard to paste
pasteMenuItem.Enabled = Clipboard.ContainsText();
}
and attach it to the editMenuItem.DropDownOpened
event (when using Forms) or editMenuItem.SubmenuOpened
event (when using WPF; You may also want to use RoutedEventArgs
instead of EventArgs
in this case). 并将其附加到
editMenuItem.DropDownOpened
事件(使用Forms时)或editMenuItem.SubmenuOpened
事件(使用WPF时;在这种情况下,您可能还希望使用RoutedEventArgs
而不是EventArgs
)。
Alternatively, if You're using WPF, You could make use of the textBox1.SelectionChanged
event. 或者,如果您正在使用WPF,则可以使用
textBox1.SelectionChanged
事件。 It's not present in Forms, so in that case You probably should use a combination of textBox1.MouseUp
and textBox1.KeyUp
events. 它不存在于Forms中,因此在这种情况下,您可能应该使用
textBox1.MouseUp
和textBox1.KeyUp
事件的组合。
For the Second half of your question: 对于你问题的后半部分:
textbox1.TextChanged += new TextChangedEventHandler(textbox1_TextChanged);
private void textbox1_TextChanged(object sender, EventArgs e)
{
if (textbox1.Text.Length > 0)
{
// enable delete, copy & paste functions
}
else
{
// disable delete, copy & paste functions
}
}
private void textBox1_SelectionChanged(object sender, EventArgs e)
{
if (textBox1.SelectedText.Length > 0)
{
txtTextSelected.Text = textBox1.SelectedText;
Clipboard.SetText(textBox2.Text);//This is optional
}
else
{
textBox2.Text = "";
Clipboard.Clear();//This is optional
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.