2008-09-15 14 views
3

C#/ .Net 2.0で書かれたWindowsアプリケーションで[コピー]メニュー項目を実装するにはどうすればよいですか?c#/ .netで編集 - >コピーメニューを実装する方法

コントロールのテキストをマークしてから、アプリケーションのメニューバーの[編集]メニューから[コピー]メニュー項目を選択し、次にExcelなどのペーストを実行させたいとします。

私の頭を回転させるのは、どの子フォームがアクティブであるかを最初に判断する方法と、クリップボードにコピーする必要のあるマーク付きテキストを含むコントロールを見つける方法です。

助けてください。

+0

私は希望これらのメニュー項目が何であるかを知るのと同じように。 Ctrl + Cははるかに優れていますか? –

答えて

5

私の同僚をプログラミングしている重いペアの助けを借りて、私はこれを思いつき、リファクタリングしてみてください。

コードはメインフォームに配置されています。 copyToolStripMenuItem_Clickメソッドは、[編集]メニューの[コピー]メニュー項目のClickイベントを処理します。フォームがタブと目標制御のDataGridViewである場合のDataGridView右時にクリックされたときにフォームのタブコントロールは、上記の方法を使用して、アクティブコントロールとして返されるため

/// <summary> 
    /// Recursively traverse a tree of controls to find the control that has focus, if any 
    /// </summary> 
    /// <param name="c">The control to search, might be a control container</param> 
    /// <returns>The control that either has focus or contains the control that has focus</returns> 
    private Control FindFocus(Control c) 
    { 
     foreach (Control k in c.Controls) 
     { 
      if (k.Focused) 
      { 
       return k; 
      } 
      else if (k.ContainsFocus) 
      { 
       return FindFocus(k); 
      } 
     } 

     return null; 
    } 

    private void copyToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Form f = this.ActiveMdiChild; 

     // Find the control that has focus 
     Control focusedControl = FindFocus(f.ActiveControl); 

     // See if focusedControl is of a type that can select text/data 
     if (focusedControl is TextBox) 
     { 
      TextBox tb = focusedControl as TextBox; 
      Clipboard.SetDataObject(tb.SelectedText); 
     } 
     else if (focusedControl is DataGridView) 
     { 
      DataGridView dgv = focusedControl as DataGridView; 
      Clipboard.SetDataObject(dgv.GetClipboardContent()); 
     } 
     else if (...more?...) 
     { 
     } 
    } 
-1

これを小さなタスク/質問に分割する方がよいかもしれません。 あなたはそれが聞こえるようにして立ち往生しているいくつかの問題があります。

複数の「子」ウィ​​ンドウが開いています。これはMDIアプリケーションですか? これらの子ウィンドウの1つでアクションが実行されると、そのウィンドウのイベントハンドラでイベントが発生するはずです。それがセットアップの最初のことです。これがデータグリッドビューの場合は、簡単なテストを開始することをお勧めします。 DataGridView.SelectionChangedイベントをトラップしてみてください。ちょうど今のところMessageBox.Show("I copied your datas!");のようなものを投げてください。

このイベントがどのように発生するかを少なくとも理解するところから始めましょう。

ここから、あなたのデータグリッドと、それらの行の行と子コントロールについてもう少し知る必要があります。適切な範囲で適切なタイミングで発生させるイベントをレンダリングイベントに作成することができます。

0

コントロールを拡張しないと、コントロール自体がクリップボードにコピーする必要があるデータを提供します。

ApplicationCommandsのドキュメントをご覧ください。

1

現在開いているウィンドウを確認するには、Form.ActiveMDIChildプロパティを照会して、現在アクティブなウィンドウへの参照を取得します。そこから、次の2つのうちのいずれかを実行できます。

1)新しいパブリックメンバー関数GetCopiedData()を持つ独自のカスタムFormクラス(FormFooなど)を作成してから、すべてのアプリケーションの子フォームを継承しますそのクラスは、あなただけのこのような何かを行うことができます。

((FormFoo)this.ActiveMDIChild).GetCopiedData(); 

GetCopiedData機能がクリップボードにコピーされるべきテキストを検出するために、フォーム固有の実装を持つことになりますと仮定します。

または

2)あなたはアクティブになっているフォームの種類を検出し、フォームの種類に応じて、コピーしたデータを取得するために何かをするために、継承を使用することができます。

など
Form f = this.ActiveMDIChild; 
if(f is FormGrid) 
{ 
    ((FormGrid)f).GetGridCopiedData(); 
} else if(f is FormText) { 
    ((FormText)f).GetTextCopiedData(); 
} 

アクティブなウィンドウを見つけて、コピー機能を実装する方法を説明します。 GridViewからコピーアウトするための助けが必要な場合は、別の質問を投稿することをお勧めします。

0

、それは時々可能です。

私は自分のDataGridViewのための次のハンドラを実装することでこれを回避ました: -

ます。private void dataGridView_CellMouseDown(オブジェクト送信者、DataGridViewCellMouseEventArgs E)

{

if (e.Button == MouseButtons.Right) 
{ 
     dataGridView.Focus(); 

     dataGridView.CurrentCell = dataGridView[e.ColumnIndex, e.RowIndex]; 
} 

}

関連する問題