2010-09-13 2 views
0

Я пытаюсь добавить ContextMenu в конкретную ячейку DataGridView. Как на картинке ниже:Как добавить ContextMenu в конкретный DataGridViewCell? (C# winforms)

alt text

Я нашел, что это очень трудно сделать, но я сделал это в элементе управления TextBox, используя код ниже:

private void Form1_Load(object sender, EventArgs e) 
{ 
    foreach (Control control in this.Controls) 
    { 
     // Add KeyDown event to each control in the form. 
     control.KeyDown += new KeyEventHandler(control_KeyDown);    
    } 
} 

private void control_KeyDown(object sender, KeyEventArgs e) 
{ 
    Control ctrl = (Control)sender; 
    if (e.KeyData == Keys.F1) // Check if F1 is being pressed. 
    { 
     if (ctrl.GetType() == typeOf(TextBox)) // Check if the control is a TextBox 
     { 
      ToolStripControlHost lblInfo; 
      label1.Text = "This context menu is for TextBoxes."; 
      lblInfo = new ToolStripControlHost(label1); // some Label 
      contextMenuStrip1.Items.Add(lblInfo); 
      contextMenuStrip1.Show(ctrl, 0, 25); // Popups the contextMenu just below the textBox control. 
     } 
    } 
} 

Я просто не знаю, как сделать это в определенной ячейке DataGridView. Я попытался экспериментировать на этот код:

if (ctrl.GetType() == typeOf(DataGridView)) // Check if the control is a DataGridView 
{ 
    DataGridViewCell testCell = dataGridView1[dataGridView1.CurrentCell.ColumnIndex, dataGridView1.CurrentRow.Index]; // Returns DataGridViewCell type 

    ToolStripControlHost lblInfo; 
    label1.Text = "test"; 
    lblInfo = new ToolStripControlHost(label1); // some Label 
    contextMenuStrip1.Items.Add(lblInfo); 
    contextMenuStrip1.Show(testCell, 0, 25); 
} 

Но я думаю, что ContextMenu принимает только Control типа на свой первый аргумент, и я получил это исключение:

cannot convert from 'System.Windows.Forms.DataGridViewCell' to 'System.Windows.Forms.Control' 

Существуют ли какие-либо обходной путь на этом? Пожалуйста, советую мне, что делать. Спасибо заранее.

+0

Несвязанной на ваш вопрос, но вместо 'если (ctrl.GetType() == TYPEOF (DataGridView))' Вы должны написать 'если (Ctrl есть DataGridView)' , – Timwi

+0

Я не знал этого ... спасибо. – yonan2236

ответ

0

Приложить на DataGridView MouseDown событие

private void _dgwMain_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     DataGridView.HitTestInfo info = _dgwMain.HitTest(e.X, e.Y); 
     //now you can use info.RowIndex and info.CellIndex (not sure for porporty   
     //name) to generate menu you want 
    } 
} 
0

Вместо того, чтобы открывать меню с помощью Ячейки, передайте ему ссылку на сетку и установите относительные координаты ячейки на основе gridview.

+0

спасибо .... хорошая идея :) – yonan2236

Смежные вопросы