Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > ContextMenuStrip и DataGridView


Автор: darkness 15.5.2007, 13:04
Народ, каким образом работая в  DataGridView, при выделении определённой записи выскакивало бы контестное меню  с определённым перечнем возможных действий? 
По ману(С# 2005 для профессионалов)  посмотрел, там подобное реализуется через применение рефлексии...
Можно ли это организовать более простым способом? Если кто сталкивался с подобной задачей киньте зацепку для её реализации ПЛИЗ!!!

Автор: XavierElf 15.5.2007, 15:17
Можно к примеру анализировать выделенное и выставлять для него соответствующие пункты...

Автор: tol05 15.5.2007, 15:29
1. создаешь контекстное меню contextMenuStrip и заполняешь его (определенные тобой действия)
2. подписываешься на событие RowEnter. В нем анализируешь строку (она была выделена для работы) и если это - нужная тебе строка, активизируешь меню


Код

//Нужно строка с RowIndex = 20
private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
{
    if(e.RowIndex == 20)
    {
        contextMenuStrip.Show();
    }
}


так, кстати, можно делать и для столбцов, для ячеек, для всего, что угодно, лишь бы оно могло сообщить о том, что с ним начали работать smile

Единственное что (когда-то головой об это бился - настроить координаты меню, оно ведь к контролу не привязано и не знает, где ему конкретно прорисовываться) - прийдется помучаться
что-то вроде такого кода я добавлял
Код

private void contextMenuStrip_Paint(object sender, PaintEventArgs e)
    {
      int x = currentNode.Bounds.Left + ActiveForm.Left + 32;
      int y = currentNode.Bounds.Top + ActiveForm.Top + 88;
      contextMenuStrip.Location = new Point(x, y);
    }

короче, и на него события нужно будет отлавливать

Автор: darkness 16.5.2007, 00:52
tol05, примерно так себе и представлял всю эту реализацию... Будем пробовать  smile 

Автор: darkness 17.5.2007, 21:05
tol05, думаю эта реализация немного попроще будет...

Код

private void dGG_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
  if (e.ColumnIndex != -1 && e.RowIndex != -1 && e.Button == MouseButtons.Right)
            {

                contextMenuStrip1.Show(MousePosition);
                MessageBox.Show(e.ColumnIndex.ToString());
            }
}


ColumnIndex   и RowIndex помогут выйти на конкретный щёлкнутый Cell.... Вообщем ничего сложного оказывается и нет...
И причём здесь рефлексия?

Автор: tol05 17.5.2007, 22:15
Я вообще никакой реализации не предлагал  просто хотел подчеркнуть, что при вызове contextMenuStrip1.Show() нужно подумать над MousePosition smile
Если получается через 
Цитата(darkness @  17.5.2007,  21:05 Найти цитируемый пост)
ColumnIndex   и RowIndex

то замечательно

только где определяется MousePosition? Может, если ее расписать, то реализация опять станет сложной? smile

Мне в свое время повезло меньше, не было у меня ни грида, ни ColumnIndex   и RowIndex
Если ты на мой код посмотришь, то это увидишь. Приходилось обходиться тем, что было.smile

Удачи. Спасибо, что интересуешься моим мнением. 

Автор: darkness 18.5.2007, 00:34
tol05, тебе спасибо - натолкнул на решение   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)