【问题标题】:Detecting some text has been selected in a textbox检测到某些文本已在文本框中被选中
【发布时间】:2013-01-26 05:12:25
【问题描述】:

我已经在c#中实现了一个记事本应用程序,所有功能都运行良好,只有一件事我无法完全实现。编辑下拉菜单中有一些菜单项,但它们的启用属性必须根据文本框的情况,我有两种情况的问题,我正在寻找一个事件,以便在此事件的事件处理程序中更改它们的启用属性,问题如下:

2)当在文本框中选择了一些文本时,删除、复制和粘贴选项应该被启用。我应该如何检测它?我已经测试了 texchanged 事件,我已经编写了一个类似下面代码的条件,但它没有不行,只有剪贴板可以正常工作:

private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (textBox1.SelectionLength> 0)
            button1.Enabled = false;
        if (Clipboard.ContainsText())
            button2.Enabled = false;


    }

我应该如何解决我的问题,顺便说一下,我必须使用文本框而不是富文本框。 任何建议将不胜感激。 非常感谢

【问题讨论】:

  • 重新发明轮子或家庭作业?周围有很多很好的记事本替代品,例如notepad-plus-plus.org
  • 提示:MouseUp 事件。
  • 这只是一个家庭作业。非常感谢
  • @Shadis 查看我编辑的帖子
  • Clipboard.containsText() 在您的格式中不起作用,请再次查看我编辑的帖子。我认为你是一个初学者

标签: c# textbox selection copy-paste


【解决方案1】:
    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
        }
    }

【讨论】:

  • 请在您的答案中添加一些上下文。只是原始代码并不能解释为什么会这样。一个解释会让你的答案更有用
【解决方案2】:

嗯,在我看来,最简单的方法是定义启用/禁用方法:

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

并将其附加到editMenuItem.DropDownOpened 事件(使用表单时)或editMenuItem.SubmenuOpened 事件(使用 WPF 时;在这种情况下,您可能还想使用RoutedEventArgs 而不是EventArgs)。

或者,如果您使用的是 WPF,则可以使用 textBox1.SelectionChanged 事件。它不存在于表单中,因此在这种情况下,您可能应该使用 textBox1.MouseUp 和 textBox1.KeyUp 事件的组合。

【讨论】:

    【解决方案3】:

    找出选择

    if (textbox1.SelectionLength > 0)
    {
    
    }
    

    对于剪贴板内容, 使用

    System.Windows.Forms.Clipboard.getText();
    

    检查剪贴板内容,

    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."; 
    

    这是在代码中实现的。可以如上直接使用

    最重要的,别忘了

    public virtual string SelectedText { get; set; }
    

    这是带有菜单项的完整代码

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

    【讨论】:

    • 非常感谢!但if (textbox1.SelectedText.Length > 0) { } 对我不起作用!请问我应该在 textchanged 事件中将它们写在哪里?
    • 我之前已经检查过了!我应该把它写在我的代码的其他地方吗?
    • 没有必要。但是用 text_changed 事件试试这个
    • 谢谢,但是当我选择文本时没有任何反应!请再次检查我的问题以获取代码
    • 您应该使用弹出和快捷键创建菜单项,并在菜单下编写代码。如果您不想要菜单项,则设置 visible=false。所以显然你可以使用快捷键
    【解决方案4】:

    为我工作。

    private void button2_Click(object sender, EventArgs e)
        {
            if (textBox1.SelectedText != String.Empty)  
            {
                label1.Text = textBox1.SelectedText;
            }
    
    
            if (Clipboard.ContainsText())
            {
                label2.Text = Clipboard.GetText();
            }
        }
    

    【讨论】:

      【解决方案5】:

      对于你问题的后半部分:

      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
          }
      }
      

      【讨论】:

      • 我告诉过当用户选择一些文本时我要启用复制和粘贴...!您编写的代码不符合我的要求!
      • 好的,很抱歉您在我回答后澄清了您的问题。如果您希望在文本选择而不是文本更改后触发事件,则将 TextChangedEventHandler 更改为 RoutedEventHandler: textbox1.SelectionChanged += new RoutedEventHandler(textbox1_SelectionChanged);至于if语句:if(textbox1.SelectionLength > 0)
      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      相关资源
      最近更新 更多