我在c#中实现了一个记事本应用程序,所有的功能都很完美,只有一件我无法正确实现。编辑下拉菜单中有一些菜单项,但是它们的启用属性必须根据文本框的情况,我有两个情况的问题,我正在寻找一个事件,以便在此事件的事件处理程序中更改其启用的属性,这是问题所在:
2)当在文本框中选择了一些文本时,应该启用删除,复制和粘贴选项。我应该检测它吗?我已经测试了texchanged事件,我写了一个类似下面的代码的条件,但它没有不行,只是剪贴板效果很好:
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (textBox1.SelectionLength> 0)
button1.Enabled = false;
if (Clipboard.ContainsText())
button2.Enabled = false;
}
我应该如何使用文本框而不是richtextbox来解决我的问题。 任何建议将不胜感激。 非常感谢
答案 0 :(得分:8)
找出选择
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();
}
}
答案 1 :(得分:1)
为我工作。
private void button2_Click(object sender, EventArgs e)
{
if (textBox1.SelectedText != String.Empty)
{
label1.Text = textBox1.SelectedText;
}
if (Clipboard.ContainsText())
{
label2.Text = Clipboard.GetText();
}
}
答案 2 :(得分:1)
对于你问题的后半部分:
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
}
}
答案 3 :(得分:1)
嗯,在我看来,最简单的方法是定义启用/禁用方法:
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
事件的组合。
答案 4 :(得分:0)
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
}
}