Search code examples
c#textboxselectioncopy-paste

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:

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:

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. Any suggestions will be appreciated. Thanks a lot


Solution

  • 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();
    }
    }