Как реализовать меню Edit -> Copy в c # /. Net - PullRequest
3 голосов
/ 15 сентября 2008

Как реализовать пункт меню «Копировать» в приложении Windows, написанном на C # /. NET 2.0?

Я хочу позволить пользователю пометить некоторый текст в элементе управления, а затем выбрать пункт меню «Копировать» в меню «Правка» в строке меню приложения и затем выполнить вставку, например, в Excel.

Что заставляет меня кружиться головой, так это то, как сначала определить, какая дочерняя форма активна, а затем как найти элемент управления, содержащий отмеченный текст, который должен быть скопирован в буфер обмена.

Помогите, пожалуйста.

Ответы [ 5 ]

5 голосов
/ 15 сентября 2008

С помощью какого-то тяжелого парного программирования мой коллега и я придумали это, не стесняйтесь рефакторинг.

Код размещается в основной форме. Метод copyToolStripMenuItem_Click обрабатывает событие Click в пункте меню Copy в меню Edit.

    /// <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 голос
/ 15 сентября 2008

Чтобы определить, какое окно открыто, вы можете запросить свойство Form.ActiveMDIChild, чтобы получить ссылку на текущее активное окно. Оттуда вы можете сделать одну из двух вещей:

1) Если вы создаете свой собственный класс Form (например, FormFoo), который имеет новую открытую функцию-член GetCopiedData (), а затем наследуете все дочерние формы вашего приложения от этого класса, вы можете просто сделать что-то вроде этого: 1003 *

((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 голосов
/ 30 июля 2009

Если форма имеет вкладки и целевой элемент управления является DataGridView, иногда можно вернуть TabControl формы в качестве активного элемента управления, используя описанный выше метод, когда DataGridView щелкают правой кнопкой мыши.

Я справился с этим, реализовав следующий обработчик для моего DataGridView: -

private void dataGridView_CellMouseDown (отправитель объекта, DataGridViewCellMouseEventArgs e)

{

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

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

}

0 голосов
/ 15 сентября 2008

Почему бы не расширить элемент управления, поэтому сам элемент управления предоставляет данные, которые следует скопировать в буфер обмена.

Взгляните на ApplicationCommands документацию.

0 голосов
/ 15 сентября 2008

Мне кажется, вам лучше разбить это на более мелкие задачи / вопросы. У вас есть несколько проблем, из-за которых вы застряли.

У вас открыто несколько дочерних окон. Это приложение MDI? Когда действие выполняется в одном из этих дочерних окон, оно должно инициировать событие в обработчиках событий этого окна. Это ваша первая вещь, которую нужно настроить. Если это обзор данных, я бы предложил начать простой тест. Попробуйте перехватить событие DataGridView.SelectionChanged . Просто добавьте что-то вроде MessageBox.Show("I copied your datas!");.

Это должно помочь вам начать с того, что вы, по крайней мере, поймете, как это событие будет вам преподнесено.

Здесь нам нужно будет немного больше узнать о вашей сетке данных, а также о строках и дочерних элементах управления в этих строках. Тогда мы, вероятно, можем создать события в событиях рендеринга, которые будут вызваны в подходящее время, с соответствующей областью действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...