2013-06-10 3 views
1

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

Код:

private void Form1_Load(object sender, EventArgs e) 
    { 
     Matches(); 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("Test", typeof(string)); 
     dt.Rows.Add("A"); 
     dt.Rows.Add("A"); 
     dt.Rows.Add("A"); 
     dt.Rows.Add("A"); 
     dt.Rows.Add("A"); 
     dt.Rows.Add("A"); 
     ContextMenuStrip ctsForm = new ContextMenuStrip(); 
     ctsForm.Items.Add("Form"); 
     ctsForm.Opening+=ctsForm_Opening; 
     ctsGrid.Items.Add("Grid"); 
     gridControl1.DataSource = dt; 

     gridView1.PopupMenuShowing+=gridView1_PopupMenuShowing; 
     this.ContextMenuStrip = ctsForm; 

    } 

    private void ctsForm_Opening(object sender, CancelEventArgs e) 
    { 


    } 

    private void gridView1_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) 
    { 
     GridView view = (GridView)sender; 
     GridHitInfo hitInfo = view.CalcHitInfo(e.Point); 
     if (hitInfo.InRow) 
     { 
      view.FocusedRowHandle = hitInfo.RowHandle; 
      ctsGrid.Show(view.GridControl, e.Point); 
     } 
    } 
+2

WPF? WinForms? ASP.Net? –

+0

его winform извините забыл упомянуть –

+0

Не могу воспроизвести вашу проблему. Это ваш собственный ContextMenuStrip на Form, который является upcomming или стандартным ContextMenu из LayoutControl или sth.? – Sebi

ответ

1

Вот возможное решение:

void Form1_Load(object sender, EventArgs e) { 
    DataTable dt = new DataTable(); 
    dt.Columns.Add("Test", typeof(string)); 
    dt.Rows.Add("A"); 
    dt.Rows.Add("A"); 
    dt.Rows.Add("A"); 
    dt.Rows.Add("A"); 
    dt.Rows.Add("A"); 
    dt.Rows.Add("A"); 
    gridControl1.DataSource = dt; 

    ContextMenuStrip ctsForm = new ContextMenuStrip(); 
    ctsForm.Items.Add("Form"); 
    ctsForm.Opening += ctsForm_Opening; 
    this.ContextMenuStrip = ctsForm; 

    ContextMenuStrip ctsGrid = new ContextMenuStrip(); 
    ctsGrid.Items.Add("Grid Row!"); 
    ctsGrid.Opening += ctsGrid_Opening; 
    gridControl1.ContextMenuStrip = ctsGrid; 

    // gridView1.PopupMenuShowing removed at all 
} 
void ctsGrid_Opening(object sender, System.ComponentModel.CancelEventArgs e) { 
    e.Cancel = !IsPointInGridRow(gridView1, gridControl1.PointToClient(Control.MousePosition)); 
} 
void ctsForm_Opening(object sender, System.ComponentModel.CancelEventArgs e) { 
    // some code 
} 
static bool IsPointInGridRow(GridView view, Point pt) { 
    return view.CalcHitInfo(pt).InRow; 
} 
+0

Можете ли вы предложить какой-либо способ, если я хочу продолжить назначать ctsGrid для просмотра только не для управления сеткой ....? –

+0

@RahulVasantraoKamble view не является элементом управления, поэтому вы не можете назначать ContextMenuStrip с помощью gridView. В любом случае, я рекомендую вам переопределить встроенное меню представления, а не использовать ContextMenuStrip с управлением сеткой. Чтобы переопределить контекстное меню, используйте событие PopupMenuShowing. Чтобы узнать больше, взгляните на [документацию] (http://documentation.devexpress.com/#WindowsForms/DevExpressXtraGridViewsGridGridView_PopupMenuShowingtopic) – DmitryG

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