简体   繁体   English

已在文本框中选择检测某些文本

[英]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.MouseUptextBox1.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM