Обнаружение некоторого текста было выбрано в текстовом поле
Я реализовал приложение для блокнота в С#, все функции работают отлично, есть только одна вещь, которую я не могу реализовать точно. В раскрывающемся меню редактирования есть некоторые элементы меню, но их включенное свойство должно изменяться в соответствии с ситуация в текстовом поле, у меня проблема с двумя ситуациями, и я ищу событие, чтобы изменить его включенное свойство в этом обработчике событий события, вот проблема:
2) Когда в текстовом поле выбран какой-либо текст, удалите, скопируйте и вставьте параметры. Как мне его обнаружить? Я тестировал событие texchanged, и я написал условие, подобное приведенному ниже, но это не было Не работает, просто буфер обмена работает хорошо:
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (textBox1.SelectionLength> 0)
button1.Enabled = false;
if (Clipboard.ContainsText())
button2.Enabled = false;
}
Как мне решить мою проблему, кстати, я должен использовать текстовое поле, а не richtextbox.
Любые предложения будут оценены.
Большое спасибо
Ответы
Ответ 1
Чтобы узнать выбор
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();
}
}
Ответ 2
Работал для меня.
private void button2_Click(object sender, EventArgs e)
{
if (textBox1.SelectedText != String.Empty)
{
label1.Text = textBox1.SelectedText;
}
if (Clipboard.ContainsText())
{
label2.Text = Clipboard.GetText();
}
}
Ответ 3
Для второй половины вашего вопроса:
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
}
}
Ответ 4
Ну, на мой взгляд, самый простой способ сделать это - определить способ включения/отключения:
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 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
.