这是我想要完成的事情:
我有两个datagriddviews。 Datagridview1包含一个url列表。 Datagridview2基本上是一个书签系统。用户可以右键单击datagridview1中的URL并选择收藏或“标记”它。然后该行将被复制到datagridview2。然后,datagridview1上行上的字体将以粗体显示,表明它已被收藏并添加到datagridview2。我如何保持这两个同步?例如,如果用户删除了datagridview2上的收藏夹,那么它应该在datagridview1上变为unbolded,因为它不再是收藏夹。由于索引会有所不同,保持这两个同步的有效方法是什么?我通过迭代遍历每一行来查看单元格内容字符串是否相等,然后基于此解除绑定,但这看起来非常低效。有关如何实现这一目标的任何建议吗?
答案 0 :(得分:1)
作为一个不错的选择,您可以拥有数据源,例如DataTable
和字符串Url
以及bool Favorite
列。
然后,将第一个网格绑定到数据表作为其DataSource
。
将第二个网格绑定到您从数据表创建的DataView
,并将Favorite=true
设置为Filter
。
然后处理第一个RowPrePaint
的{{1}}事件,如果行有DataGridView
,则将字体设置为粗体,否则将字体设置为常规。
对于添加按钮和删除按钮,在当前行后面的数据行上设置favorite=true
列的值,然后在数据行上调用favorite
。
<强>初始化强>
EndEdit
<强> RowPrePaint 强>
private void Form1_Load(object sender, EventArgs e)
{
//Create DataTable
var data = new DataTable();
data.Columns.Add("Url", typeof(string));
data.Columns.Add("Favorite", typeof(bool));
//Fill Data
data.Rows.Add("http://stackoverflow.com", true);
data.Rows.Add("http://bing.com", false);
data.Rows.Add("http://google.com", false);
//Set DataBidnings to allUrlsDGV
this.allUrlsDGV.DataSource = data;
//Set DataBidnings to favoriteUrlsDGV
var favoriteData = new DataView(data);
favoriteData.RowFilter = "Favorite=true";
this.favoriteUrlsDGV.DataSource = favoriteData;
}
添加和删除按钮
private void allUrlsDGV_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
var f = e.InheritedRowStyle.Font;
var drv = (DataRowView)allUrlsDGV.Rows[e.RowIndex].DataBoundItem;
if (drv.Row.Field<bool>("Favorite") == true)
allUrlsDGV.Rows[e.RowIndex].DefaultCellStyle.Font = new Font(f, FontStyle.Bold);
else
allUrlsDGV.Rows[e.RowIndex].DefaultCellStyle.Font = new Font(f, FontStyle.Regular);
}