【问题】
已经实现了给DataGridView中添加对应的Button:
【已解决】C#的DataGridView中的单元格内添加按钮(整列都是按钮)
现在希望对于DataGridViewButtonCell一列中,点击对应的每个row的那个ButtonCell,可以获得对应的事件,进行相关的处理。
【解决过程】
1.搜
c# DataGridViewButtonCell event
然后参考:
如何获取DataGridViewButtonColumn 中的Click事件
DataGridViewButtonCell Click Event
DataGridView ,DataGridViewButtonColumn如何添加 onclick事件
以及微软官网:
DataGridView.CellContentClick 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还是之前的值:
导致无法设置所需要的,每个cell都是不同的值。
而如果把
gigUrlColumn.UseColumnTextForButtonValue = true;
去掉,那么结果就又是每个DataGridViewButtonCell的值,看起来都是乱码:
始终无法实现:
对于每个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:
点击任何一个,都可以跳转到对应的url。
比如:
http://fiverr.com/seostar/create-complete-seo-analysis-report-of-your-website
【总结】
终于搞定了。
话说,DataGridViewButtonCell,做得还是不够好用啊。应该直接支持button的event才对。
转载请注明:在路上 » 【已解决】给C#的DataGridView中的DataGridViewButtonCell添加事件