同步两个数据网格视图的最有效方法是什么

本文关键字:视图 有效 是什么 方法 网格 数据网 数据 两个 同步 | 更新日期: 2023-09-27 18:29:22

以下是我试图实现的目标:

我有两个数据网格视图。Datagridview1包含一个url列表。Datagridview2基本上是一个书签系统。用户可以右键单击datagridview1中的一个url,然后选择收藏夹或"书签"。然后该行将被复制到datagridview2。datagridview1上的行上的字体将变为粗体,以显示它已被偏爱并添加到datagridview2中。我如何保持这两个同步?例如,如果用户删除了datagridview2上的收藏夹,那么它在datagridview1上应该变为不粗体,因为它不再是收藏夹。由于索引不同,保持这两个索引彼此同步的有效方法是什么?我已经完成了对每一行的迭代,看看单元格内容字符串是否相等,然后在此基础上取消粗体,但这似乎效率很低。关于如何做到这一点,有什么建议吗?

同步两个数据网格视图的最有效方法是什么

作为一个不错的选项,您可以拥有像DataTable这样的数据源,该数据源具有字符串Url和布尔Favorite列。

然后,将第一个网格绑定到数据表作为其DataSource

将第二个网格绑定到从数据表创建的DataView,并将Favorite=true设置为其Filter

然后处理第一个DataGridViewRowPrePaint事件,如果该行有favorite=true,则设置字体为粗体,否则设置字体为常规。

对于add按钮和remove按钮,设置当前行后面数据行上favorite列的值,然后调用数据行上的EndEdit


初始化

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;
}

RowPrePaint

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

添加和删除按钮

private void AddButton_Click(object sender, EventArgs e)
{
    if (allUrlsDGV.CurrentRow == null)
        return;
    var drv = (DataRowView)allUrlsDGV.CurrentRow.DataBoundItem;
    drv.Row["Favorite"] = true;
    drv.Row.EndEdit();
}
private void RemoveButton_Click(object sender, EventArgs e)
{
    if (favoriteUrlsDGV.CurrentRow == null)
        return;
    var drv = (DataRowView)favoriteUrlsDGV.CurrentRow.DataBoundItem;
    drv.Row["Favorite"] = false;
    drv.Row.EndEdit();
}