【问题】
已经实现了给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添加事件