【已解决】给C#的DataGridView中的DataGridViewButtonCell添加事件

【问题】

已经实现了给DataGridView中添加对应的Button:

【已解决】C#的DataGridView中的单元格内添加按钮(整列都是按钮)

现在希望对于DataGridViewButtonCell一列中,点击对应的每个row的那个ButtonCell,可以获得对应的事件,进行相关的处理。

 

【解决过程】

1.搜

c# DataGridViewButtonCell event

然后参考:

如何获取DataGridViewButtonColumn 中的Click事件

DataGridViewButtonCell Click Event

DataGridView ,DataGridViewButtonColumn如何添加 onclick事件

以及微软官网:

DataGridView.CellContentClick Event

去添加代码:

 

cell content click event

 

        private void dgvSearchResult_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            int gigUrlColumnIdx = 12;
            if (e.ColumnIndex == gigUrlColumnIdx)
            {
                //MessageBox.Show(dgvSearchResult.SelectedCells[0].Value.ToString());
                MessageBox.Show(dgvSearchResult.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());

 
            }
        }

的确是可以捕获到,对应的点击事件的。

2. 但是此处很是诡异的是,如果是开始设置:

gigUrlColumn.UseColumnTextForButtonValue = true;

那么此时,每个DataGridViewButtonCell,即使给value赋值:

            DataGridViewButtonCell gigUrlCell = new DataGridViewButtonCell();
            gigUrlCell.Value = singleGigInfo.gigUrl;

结果好像也是没用的,每个DataGridViewButtonCell的value还是之前的值:

all button cell value same

导致无法设置所需要的,每个cell都是不同的值。

 

而如果把

gigUrlColumn.UseColumnTextForButtonValue = true;

去掉,那么结果就又是每个DataGridViewButtonCell的值,看起来都是乱码:

button cell value messy

 

始终无法实现:

对于每个DataGridViewButtonCell,其所看到的值,希望是那种Button的Text的值,此处每个都是对应的Buy Now,则是符合预期的;

而对于额外的value,可以保存对应的不同的值,对应的希望是不同的url值:singleGigInfo.gigUrl

对于点击不同的DataGridViewButtonCell时,可以获得对应的每个DataGridViewButtonCell的value值,即不同的url。

 

此处,貌似一直没法实现这样的效果。。。。

3.最后折腾半天,终于可以了:

(1)把DataGridViewButtonColumn弄成全局变量:

public DataGridViewButtonColumn gigUrlColumn = null;

(2)初始化时去初始化:

        public frmFiverrComScraper()
        {
            InitializeComponent();

            crifanLib = new crifanLib();
            gigUrlColumn = new DataGridViewButtonColumn();
        }

(3)然后开始配置DataGridViewButtonColumn时,不要设置UseColumnTextForButtonValue :

            gigUrlColumn.HeaderText = "Gig Url";
            //gigUrlColumn.Name = "Gig Url name";
            gigUrlColumn.Text = "Buy Now";
            //gigUrlColumn.UseColumnTextForButtonValue = true;
            gigUrlColumn.Width = 106;
            dgvSearchResult.Columns.Add(gigUrlColumn);

(4)在添加row的cell时,不直接添加DataGridViewButtonCell到对应的那个DataGridViewButtonColumn列上去,而是,直接忽略掉,不设置.

然后单独去设置对应的该DataGridViewButtonCell的value和tag.

其他value是button的Text,而tag,用于此处存放我们想要的数据.

代码为:

            //DataGridViewButtonCell gigUrlCell = new DataGridViewButtonCell();
            //gigUrlCell.Value = "Buy Now";
            //gigUrlCell.Tag = singleGigInfo.gigUrl;

            dgvSearchResult.Rows.Add(
                singleGigInfo.title,
                singleGigInfo.sellerRating,
                singleGigInfo.estimatedDelivery,
                singleGigInfo.gigRating,
                singleGigInfo.ordersInQueue,
                singleGigInfo.sellerLevel,
                singleGigInfo.hasVideo,
                singleGigInfo.isExpressGig,
                singleGigInfo.coutryFlag,
                singleGigInfo.positiveReviews,
                singleGigInfo.negativeReviews,
                singleGigInfo.isTopRatedSeller);
                //gigUrlCell);
                //singleGigInfo.gigUrl);

            int gigUrlColumnIdx = 12;
            gigUrlColumn.DataGridView.Rows[dgvSearchResult.Rows.Count - 2].Cells[gigUrlColumnIdx].Value = "Buy Now";
            gigUrlColumn.DataGridView.Rows[dgvSearchResult.Rows.Count - 2].Cells[gigUrlColumnIdx].Tag = singleGigInfo.gigUrl;

(5)最后,在捕获button的cell的click事件中,就可以分别获取对应的Value和Tag了。

真正想要的是Tag的值,存放的是我们所需要的url。

然后实现点击button,跳转到对应的url。

代码为:

        private void dgvSearchResult_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            int gigUrlColumnIdx = 12;
            if (e.ColumnIndex == gigUrlColumnIdx)
            {
                DataGridViewButtonCell clickedButtonCell = (DataGridViewButtonCell)dgvSearchResult.Rows[e.RowIndex].Cells[e.ColumnIndex];
                //MessageBox.Show(clickedButtonCell.Value.ToString() + clickedButtonCell.Tag.ToString());
                System.Diagnostics.Process.Start(clickedButtonCell.Tag.ToString()); 
            }
        }

 

运行效果为:

每个DataGridViewButtonCell所显示出来的按钮的文字,就是value,都是统一的Buy Now:

click some button cell

点击任何一个,都可以跳转到对应的url。

比如:

http://fiverr.com/seostar/create-complete-seo-analysis-report-of-your-website

 

【总结】

终于搞定了。

话说,DataGridViewButtonCell,做得还是不够好用啊。应该直接支持button的event才对。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量