This is a migrated thread and some comments may be shown as answers.

How to inherit GridViewCellEventArgs in a MouseDown Event

10 Answers 136 Views
GridView
This is a migrated thread and some comments may be shown as answers.
anh
Top achievements
Rank 1
anh asked on 18 Nov 2010, 11:32 PM

Hello,

I am trying to figure out on how to get the selected row and column index on a RadGridView in a MouseDown event. What I am trying to do is when the user right clicks, a context menu strip pops up with options to do something..

P.S. I am trying to do it in C# VS2010.

Thank you,

Greatly Appreciated.

10 Answers, 1 is accepted

Sort by
0
Richard Slade
Top achievements
Rank 2
answered on 19 Nov 2010, 12:10 AM
Hello,

This should do what you need. It's just a RadGridView on a form.
Imports Telerik.WinControls
Imports Telerik.WinControls.UI
Imports System.Globalization
  
Public Class Form1
  
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  
        Dim list As New List(Of person)
        list.Add(New person("Richard", 1))
        list.Add(New person("Bob", 2))
        list.Add(New person("Stewart", 3))
        list.Add(New person("Chris", 4))
        list.Add(New person("Leisl", 1))
        list.Add(New person("Tom", 5))
        list.Add(New person("Oly", 6))
  
        Me.RadGridView1.DataSource = list
    End Sub
  
    Private Sub RadGridView1_ContextMenuOpening(ByVal sender As System.Object, _
        ByVal e As Telerik.WinControls.UI.ContextMenuOpeningEventArgs) Handles RadGridView1.ContextMenuOpening
  
        e.ContextMenu.Items.Clear()
        Dim menuItem As New RadMenuItem("My Item")
        AddHandler menuItem.Click, AddressOf MenuItem_Click
        e.ContextMenu.Items.Add(menuItem)
  
    End Sub
  
    Private Sub MenuItem_Click(ByVal sender As Object, ByVal e As EventArgs)
        MessageBox.Show("Column: " & Me.RadGridView1.CurrentColumn.Index.ToString() & " Row:" & Me.RadGridView1.CurrentRow.Index.ToString())
    End Sub
  
End Class
  
Public Class person
    Private m_Id As Integer
    Private m_Name As String
  
    Public Sub New()
    End Sub
  
    Public Sub New(ByVal name As String, ByVal id As Integer)
        m_Name = name
        m_Id = id
    End Sub
  
    Public Property Name() As String
        Get
            Return m_Name
        End Get
        Set(ByVal value As String)
            m_Name = value
        End Set
    End Property
  
    Public Property Id() As Integer
        Get
            Return m_Id
        End Get
        Set(ByVal value As Integer)
            m_Id = value
        End Set
    End Property
End Class

Let me know if you need more help

Richard
0
anh
Top achievements
Rank 1
answered on 19 Nov 2010, 12:52 AM

Hello Richard,

I really appreciate your help, but I am not sure I understands the code you've posted. Sorry, forgive me. My programming experiences are limited and also programming languages. I am trying to do it in C#, I am sure VB is simliar..but I would be great if you have a simple C# example would be great.

Thank you so much...

0
Emanuel Varga
Top achievements
Rank 1
answered on 19 Nov 2010, 07:48 AM
Hello anh,

Please try the following example:
using System;
using System.ComponentModel;
using System.Windows.Forms;
using Telerik.WinControls.UI;
 
public partial class Form1 : Form
{
    private RadGridView radGridView1;
 
    public Form1()
    {
        InitializeComponent();
        this.Controls.Add(radGridView1 = new RadGridView());
        radGridView1.Dock = DockStyle.Fill;
        radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
        radGridView1.ContextMenuOpening += new ContextMenuOpeningEventHandler(radGridView1_ContextMenuOpening);
    }
 
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        radGridView1.DataSource = new BuyersCollection();
    }
 
    void radGridView1_ContextMenuOpening(object sender, ContextMenuOpeningEventArgs e)
    {
        if (e.ContextMenuProvider is GridDataCellElement)
        {
            // this context menu has been fired from the cell
            e.ContextMenu.Items.Clear();
            var menuItem = new RadMenuItem("MenuItem1");
            menuItem.Click += new EventHandler(menuItem_Click);
 
            var menuItem2 = new RadMenuItem("MenuItem2");
            menuItem2.Click += new EventHandler(menuItem2_Click);
 
            e.ContextMenu.Items.AddRange(menuItem, menuItem2);
        }
    }
 
    void menuItem2_Click(object sender, EventArgs e)
    {
        var currentCell = radGridView1.CurrentCell;
        var currentRow = radGridView1.CurrentRow;
 
        MessageBox.Show("Menu Item 2 clicked");
    }
 
    void menuItem_Click(object sender, EventArgs e)
    {
        var currentCell = radGridView1.CurrentCell;
        var currentRow = radGridView1.CurrentRow;
 
        MessageBox.Show("Menu Item 1 clicked");
    }
}
 
public class Buyer
{
    public int Id
    {
        get;
        set;
    }
 
    public string Name
    {
        get;
        set;
    }
 
    public Buyer(int id, string name)
    {
        this.Id = id;
        this.Name = name;
    }
}
 
public class BuyersCollection : BindingList<Buyer>
{
    public BuyersCollection()
    {
        for (int i = 0; i < 10; i++)
        {
            this.Add(new Buyer(i, "Buyer" + (i)));
        }
    }
}

If i understood correctly you only need to show your custom menu when rightclicking on cells, not on the header also, right?
And for the clicked cell and row, it will always be the current cell and current row from the grid, so you can just get them from the grid with radGridView1.CurrentCell or radGridView1.CurrrentRow

Hope this helps, if you have any other questions or comments, please let me know,

Best Regards,
Emanuel Varga
Telerik WinForms MVP
0
Richard Slade
Top achievements
Rank 2
answered on 19 Nov 2010, 08:30 AM
Hello anh,

The example I provided, and the one Emanuel provided in C# will work for you. To give you an explanation of what is happening, is that the ContextMenuOpening event has been registered for the grid. This is because the grid already has a context menu associated with it. The code is clearing the items in that context menu and adding it's own custom one. A click event is then being registered for that menu item.

When a user right clicks and gets the context menu it is in context of a row and cell. Therefore in the click event of the context menu you can display the current row / current cell which are directly available from the RadGridView object.

For future reference, there is also a code converter that you may find useful at this link

Hope this helps but let me know if you need more information
Richard
0
anh
Top achievements
Rank 1
answered on 19 Nov 2010, 09:13 PM

Hello Emanuel Varga and Richard Slade,

Thank you so much for the examples and the explanation. You guys are the BEST!  But I have a confusion as in.. I created my RadGridView via UI and then I bind the data to it from a datatable.  Everything works for my RadGridView, all I want is to have a context menu to pop up when user right click to see different options. The example from Emanuel works great and it's a good example to learn from. But how can use part of his coded and tie it to my RadGridView that I created from the UI to have a pop up context menu? I didnt' know that the RadGridView has its own context menu. I created a context menu manually and then capture the right click event....but that's where I am stuck at...I want to co capture the selected row and column index when user right clicks. But I don't know how to capture the GridViewCellEventArgs from a MouseDown event...

Either the context menu of the RadGridView or the RadContextMenu control works for me. But either way, I am still stuck.. :(

Thank you.

Anh


0
Emanuel Varga
Top achievements
Rank 1
answered on 20 Nov 2010, 12:15 AM
Hello again anh,

You don't have to get those, when you click / right click on a cell, that cell becomes the selected cell so you can just use:
var currentCell = radGridView1.CurrentCell;
var currentRow = radGridView1.CurrentRow;
to get the CurrentCell and the CurrentRow from the grid at any time.

Hope this helps, if you have any other questions or comments, please let me know,

Best Regards,
Emanuel Varga
Telerik WinForms MVP
0
anh
Top achievements
Rank 1
answered on 20 Nov 2010, 01:33 AM

Emanuel Varga,

You are the greatest!! That does it...Thank you so much.  But the example above is good for learning too.

P.S. what's the code to have the RadGridView horizontal scroll to appears to scroll left and right, if the columns width is resize or more columns are added from the column choosers. My problem is that when I resize the width of the column..the horizontal scroll bar doesn't appear. Instead..the other 3 columns width gets smaller....

Thanks again.!

0
Accepted
Emanuel Varga
Top achievements
Rank 1
answered on 20 Nov 2010, 01:54 AM
Hello anh,

For the horizontal scroll bar to appear, you have to set the AutoSizeColumnsMode to None, like so:
radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.None;

Because if you have it set to Fill, the grid will try to use just the available space for the columns, so basically it will resize other columns in order to make room for the newly added columns.

Basically if you want horizontal scrollbars you will have to manage the cell width's.

Hope this helps, if you have any other questions or comments, please let me know,

Best Regards,
Emanuel Varga
Telerik WinForms MVP
0
anh
Top achievements
Rank 1
answered on 20 Nov 2010, 02:26 AM

That does it again...Thank you so much for your help.  I would never figure that out without the help I get here.

Thanks again...

0
Emanuel Varga
Top achievements
Rank 1
answered on 20 Nov 2010, 02:30 AM
Hello again anh,

Glad to be able to help,

Just remember the mark as answer function is there so you can mark all of the answers that helped you solve your question or questions.

If you have any other questions or comments, please let me know,

Best Regards,
Emanuel Varga
Telerik WinForms MVP
Tags
GridView
Asked by
anh
Top achievements
Rank 1
Answers by
Richard Slade
Top achievements
Rank 2
anh
Top achievements
Rank 1
Emanuel Varga
Top achievements
Rank 1
Share this question
or