1

「編集->コピー」メニュー項目を作成せ、ショートカットキー「CTRL + C」を割り当てない場合は、コントロール(RichTextBox、DataGridViewなど)を選択して「CTRL +C」を押し、コントロール自体がコピーを処理します。テキストをコピーして、メモ帳などに貼り付けることができます。

今、私のフォーム全体を通して、私はたくさんのコントロールを持っています。しかし、コピー機能を処理することを明確にしたいカスタムコントロールがあります。そこで、ショートカットキーCTRL +Cを[編集]->[コピー]に追加しました。デフォルトでは、[有効]に設定されています。

次に、そのメニュー項目の「クリック」イベントのイベントハンドラーを実装する必要があります。コピーを処理するコードを明示的に挿入すると、次のように機能します。

public void menuEditCopy_Click(object sender, EventArgs e)
{
    myCustomControl.Copy();
}

ただし、現在、コピーは他のタイプのコントロールでは機能しません。私の最初の傾向は、焦点を当てているコントロールのタイプを見つけ、それらのそれぞれに限定されたコピーコードのセットを実装することでした。

public void menuEditCopy_Click(object sender, EventArgs e)
{
    if (this.ActiveControl is MyCustomControl)
    {
        ((MyCustomControl)this.ActiveControl).Copy();
    }
    else if (this.ActiveControl is RichTextBox)
    {
        ((RichTextBox)this.ActiveControl).Copy();
    }
}

等...

ただし、私のコントロールはSplitContainerに追加されており、デバッグでは、コントロールが選択されていることがわかっていても、this.ActiveControlがコントロールではなくsplitcontainerインスタンスに設定されていることが示されています。

したがって、私の最後の考えは、すべてのコントロールにフォーカスがあるかどうかを文字通りチェックすることです。

public void menuEditCopy_Click(object sender, EventArgs e)
{
    if (myCustomControl.Focused)
    {
        myCustomControl.Copy();
    }
    else if (richTextBox1.Focused)
    {
        richTextBox1.Copy();
    }
}

可能であればこれを避けたいと思います。コントロールがたくさんあり、新しいコントロールを追加する場合は、それを更新する必要があります。これを行うためのより良い方法はありますか?

ありがとう

4

2 に答える 2

3

Aは をSplitContainer実装ContainerControlしているため、どちらかをチェックしてActiveControl代わりにそれを探すことができます。ContainerControlは基本クラスなので、私はそれに行きます-別のタイプのコンテナもキャッチする可能性があります:

private void DoCopy(Control control)
{
    if(control is ContainerControl)
        DoCopy(control.SelectedControl);
    else if(control is MyCustomControl)
        ((MyCustomControl)control).Copy();
    else if(control is RichTextBox)
        ((RichTextBox)control).Copy();
    else
        throw new NotSupportedException("The selected control can't copy!");
}

void menuEditCopy_Click(object sender, EventArgs e)
{
    DoCopy(this.ActiveControl);
}
于 2009-05-08T00:10:01.793 に答える
0

フォームの KeyPreview プロパティを true に設定してみてください。次に、次のようなフォームの KeyDown イベントのハンドラーを設定できます。

private void Form_KeyDown(object sender, KeyEventArgs e)
{
    if(e.Modifiers == Keys.Control && e.KeyCode == Keys.C)
    {
        if (ActiveControl.GetType() == typeof(MyCustomControl))
        {
            ((MyCustomControl)ActiveControl).Copy();
            e.Handled = true;
        }
    }
}

ここでは、イベント引数の Handled プロパティを true に設定して、Ctrl-C イベントを処理したことを指定しています。それ以外の場合は、false のままにしておくと、Ctrl-C キーの押下は、個々のコントロールによって通常どおりに処理されます。

KeyPreview を true に設定したため、フォームのハンドラーは、含まれている他のコントロールよりも前に各キーが押されたことを確認し、キーの押下自体を処理するか、フォームが持っている場合と同じ方法で処理できるようにするかを決定できます。プレビューしたことはありません。

これを機能させるには、メニュー項目からショートカット キーを削除する必要があると思います (ただし、メニュー項目名の横にテキスト "Ctrl+C" を手動で配置することもできます)。そうしないと、メニュー項目がキーストロークをハイジャックします。

于 2009-05-08T14:56:41.823 に答える