2016-03-30 7 views
3

小さなテキストエディタを作成しています(メモ帳のように)。私のフォームにはいくつかのボタンがあります(切り取り、削除、コピー)。私は、テキストが選択されていないときにはそれらを不可能にしたい、そしてその逆...テキストが選択されているときに起こるイベントはありますか?私はテキストボックスコントロールを使用します。テキストボックスに選択テキストイベントがあります

+0

作業領域にはどのようなコントロールを使用しますか? – BWA

+3

[リッチテキストボックス](http://stackoverflow.com/questions/647963/windows-forms-selectionchanged-event-for-textbox-class)を使用すると、そのようなイベントが発生します。 – Veverke

答えて

7

、このようなイベントはありませんが、幸いな回避策があります。

1)は、(私はこれが最善の解決策ではありません認めるが、それはだから、それはより頻繁に私の好みではない以上だApplication.Idleイベントで独自の更新UIによってそれをしなさい)実装が簡単:

Application.Idle += OnIdle; 

そして:

private void OnIdle(object sender, EventArgs e) { 
    btnCopy.Enabled = txtEditor.SelectionLength > 0; 
} 

2)RichTextControl(ない最高のsから独自のクラスを派生あなたが巨大なファイルだけでなく巨大なファイルを処理しなければならない場合はolution)、そしてEN_SELCHANGE通知(私が見ているすべてのIMEと互換性がある最も堅牢なもの)を処理します。概念実証(MSDNから適切な値を選択し、EM_SETEVENTMASKENM_SELCHANGEを設定することを忘れないでください):

public class TextBoxEx : TextBox { 
    public event EventHandler SelectionChanged; 

    protected override void WndProc(ref Message m) { 
     base.WndProc(ref m); 

     if (m.Msg == WM_NOTIFY && m.lParam == EN_SELCHANGE) { 
      OnSelectionChanged(EventArgs.Empty); 
     } 
    } 

    // ... 
} 

あなたはそれを行うかもしれないが...デフォルトのコントロールが既にあなたのためにこの機能を持っている:それはSelectionChangedイベントがあります。

クリップボードの内容に応じて貼り付けボタンを更新する必要があるため、クリップボードの貼り付けもサポートしている場合は注意してください(次に簡単な場所はApplication.Idleになります)。 CanPaste()RichTextControlで同様のメソッドを呼び出すと、一部のIME(see also In Idle cannot access RichTextControl or IME will not work)が壊れる可能性があります。

+0

ありがとう。それは機能します。 –

1

RichTextBoxを使用する場合は、SelectedTextというプロパティがあります。あなたはSelectedTextが空でないかどうかを確認することができます

if (richTextBox1.SelectedText.Length > 0){ //means there is a selection 
} 

SelectionChangedイベントとそれを組み合わせる:

private void richTextBox1_SelectionChanged(object sender, EventArgs e) { 
    bool enabled = richTextBox1.SelectedText.Length > 0; 
    //do something 
} 

あなたがあった場合にControl /選択されていないテキストを有効/無効にするように制御することができます。

関連する問題