同步两个datagridviews的最有效方法是什么?

时间:2016-01-07 21:34:40

标签: c# vb.net winforms datagridview

这是我想要完成的事情:

我有两个datagriddviews。 Datagridview1包含一个url列表。 Datagridview2基本上是一个书签系统。用户可以右键单击datagridview1中的URL并选择收藏或“标记”它。然后该行将被复制到datagridview2。然后,datagridview1上行上的字体将以粗体显示,表明它已被收藏并添加到datagridview2。我如何保持这两个同步?例如,如果用户删除了datagridview2上的收藏夹,那么它应该在datagridview1上变为unbolded,因为它不再是收藏夹。由于索引会有所不同,保持这两个同步的有效方法是什么?我通过迭代遍历每一行来查看单元格内容字符串是否相等,然后基于此解除绑定,但这看起来非常低效。有关如何实现这一目标的任何建议吗?

1 个答案:

答案 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);
}