2013-02-11 40 views
10

Tôi đã triển khai một ứng dụng notepad trong C#, tất cả các feaures hoạt động hoàn hảo, chỉ có một điều mà tôi không thể thực hiện chính xác.khác là một số menuitems trong menu thả xuống chỉnh sửa , nhưng thuộc tính được bật của họ phải thay đổi tùy theo tình huống của hộp văn bản, tôi gặp sự cố với hai trường hợp và tôi đang tìm kiếm sự kiện để thay đổi thuộc tính đã bật của họ trong tổ chức sự kiện của sự kiện này, đây là vấn đề:Phát hiện một số văn bản đã được chọn trong một hộp văn bản

2) Khi một số văn bản được chọn trong hộp văn bản, xóa, sao chép và dán các tùy chọn sẽ được kích hoạt. Tôi nên phát hiện ra nó như thế nào? Tôi đã thử nghiệm sự kiện texchanged tôi đã viết một điều kiện như mã dưới đây nhưng nó không hoạt động, chỉ cần khay nhớ tạm hoạt động tốt:

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


    } 

Tôi nên giải quyết vấn đề của mình bằng cách nào tôi phải sử dụng hộp văn bản không phải là richtextbox. Mọi đề xuất sẽ được đánh giá cao. Cảm ơn rất nhiều

+0

Tái phát minh ra bánh xe hoặc bài tập về nhà? Có rất nhiều lựa chọn thay thế notepad tốt xung quanh ví dụ: http://notepad-plus-plus.org/ –

+0

Gợi ý: sự kiện 'MouseUp'. –

+0

Nó chỉ là một bài tập về nhà.thanks rất nhiều –

Trả lời

8

Để tìm hiểu lựa chọn

if (textbox1.SelectionLength > 0) 
{ 

} 

Đối với nội dung clipboard, sử dụng

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

tra vào 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."; 

Điều này được thực hiện trong mã. Bạn có thể sử dụng nó trực tiếp như trên

Quan trọng nhất, đừng quên

public virtual string SelectedText { get; set; } 

Đây là mã hoàn chỉnh với mục menu

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

Cảm ơn rất nhiều! Nhưng 'if (textbox1.SelectedText.Length> 0) { }' không làm việc cho tôi! Và bạn vui lòng cho tôi biết tôi nên viết chúng ở đâu trong sự kiện thay đổi? –

+0

Tôi đã kiểm tra nó trước đây! Tôi có nên viết nó ở đâu đó khác trong mã của tôi không? –

+1

Không cần thiết. Nhưng hãy thử điều này với sự kiện text_changed –

1

Làm việc cho tôi.

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


     if (Clipboard.ContainsText()) 
     { 
      label2.Text = Clipboard.GetText(); 
     } 
    } 
1

Đối với nửa thứ hai của câu hỏi của bạn:

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

Tôi đã nói rằng khi người dùng chọn một số văn bản tôi muốn bật sao chép và dán ... mã bạn đã viết không khớp với yêu cầu! –

+0

Ok tôi xin lỗi vì bạn đã làm rõ câu hỏi của mình sau khi tôi đã trả lời. Nếu bạn muốn một sự kiện kích hoạt sau khi lựa chọn văn bản thay vì thay đổi văn bản, sau đó thay đổi TextChangedEventHandler thành RoutedEventHandler: textbox1.SelectionChanged + = new RoutedEventHandler (textbox1_SelectionChanged); Đối với câu lệnh if: if (textbox1.SelectionLength> 0) – Scruffy

+0

bạn được chào đón! –

1

Vâng, theo ý kiến ​​của tôi là cách dễ nhất để đi với điều này là để xác định phương pháp bật/tắt:

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

và đính kèm nó vào editMenuItem.DropDownOpened thậm chí t (khi sử dụng Biểu mẫu) hoặc editMenuItem.SubmenuOpened sự kiện (khi sử dụng WPF; Bạn cũng có thể muốn sử dụng RoutedEventArgs thay vì EventArgs trong trường hợp này).

Hoặc, nếu bạn đang sử dụng WPF, bạn có thể sử dụng sự kiện textBox1.SelectionChanged. Nó không có trong biểu mẫu, vì vậy trong trường hợp đó, bạn có thể nên sử dụng kết hợp các sự kiện textBox1.MouseUptextBox1.KeyUp.

Các vấn đề liên quan