C # DataGridView Динамические контекстные меню - PullRequest
0 голосов
/ 20 марта 2012

У меня есть C # DataGridView, который показывает время до 5 таймеров. Используя событие DataCridView MouseClick, я могу создать динамическое контекстное меню с опциями «Таймер запуска» и «Таймер остановки». Смотрите код ниже.

Проблема, с которой я столкнулся, - это связать динамические контекстные меню с методом. Например, при выборе «Start Timer 1» мне нужно, чтобы запустить первый таймер, но «Start Timer 2» нужно запустить другой. У меня уже есть метод (не связанный с контекстным меню), который запускает соответствующий таймер, но я не уверен, как связать их.

Я думаю, что где-то нужно событие в контекстном меню, но я немного растерялся.

Любая помощь будет очень полезна.

private void dataGridView1_MouseClick(object sender, MouseEventArgs e) 
{     
   if (e.Button == MouseButtons.Right)     
   {         
      ContextMenu m = new ContextMenu();         

      int r = dataGridView1.HitTest(e.X,e.Y).RowIndex;

      m.MenuItems.Add(new MenuItem("Start Timer " + r.ToString()));         
      m.MenuItems.Add(new MenuItem("Stop Timer " + r.ToString()));         

      m.Show(dataGridView1, new Point(e.X, e.Y));      
   }
}

private void StartTimer(int t)
{
   ... code starts the t timer ...
} 

Ответы [ 2 ]

0 голосов
/ 21 марта 2012

После того, как вышеприведенный код не заработал, я провел еще несколько исследований и теперь немного обошел (см. Ниже).

Я установил контекстное меню как ContextMenuStrip и связал событие ItemClick. Я не смог найти способ передать переменную «r» в метод StartTimer, поэтому мне пришлось настроить его как глобальный, что, как я знаю, не является правильным C # способом для выполнения действий. Я попытался заставить EventHandler запустить собственный метод с аргументом int, но он выдает ошибку «Имя метода ожидается».

Как я уже говорил, мой код работает, но я буду признателен за любые советы.

private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        int r = dataGridView1.HitTest(e.X, e.Y).RowIndex + 1;

        ContextMenuStrip m = new ContextMenuStrip();

        globals.timer = r;

        m.Items.Add("Start");
        m.Items.Add("Stop");
        m.ItemClicked += new ToolStripItemClickedEventHandler(m_ItemClicked);

        m.Show(dataGridView1, new Point(e.X, e.Y));
    }
}

void m_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    switch (e.ClickedItem.Text)
    {
        case "Start":
            startTimer(globals.timer);
            break;
        case "Stop":
            stopTimer(globals.timer);
            break;
        default:
            break;
    }
}

private void startTimer(int t)
{
    // code here to start timer t
} 

private void stopTimer(int t)
{
    // code here to stop timer t
}

static class globals
{
    public static int timer = 0;
}
0 голосов
/ 20 марта 2012

Вы можете обработать событие MenuItem.Click следующим образом:

var item = new MenuItem("Start Timer " + r.ToString();
item.Click += (sender, e) => this.StartTimer(r);
m.MenuItems.Add(item)

Или вы можете использовать Command и CommandParameters, если вы хотите использовать MVVM (http://msdn.microsoft.com/en-us/library/ms752308.aspx)

...