同步两个数据网格视图的最有效方法是什么
本文关键字:视图 有效 是什么 方法 网格 数据网 数据 两个 同步 | 更新日期: 2023-09-27 18:29:22
以下是我试图实现的目标:
我有两个数据网格视图。Datagridview1包含一个url列表。Datagridview2基本上是一个书签系统。用户可以右键单击datagridview1中的一个url,然后选择收藏夹或"书签"。然后该行将被复制到datagridview2。datagridview1上的行上的字体将变为粗体,以显示它已被偏爱并添加到datagridview2中。我如何保持这两个同步?例如,如果用户删除了datagridview2上的收藏夹,那么它在datagridview1上应该变为不粗体,因为它不再是收藏夹。由于索引不同,保持这两个索引彼此同步的有效方法是什么?我已经完成了对每一行的迭代,看看单元格内容字符串是否相等,然后在此基础上取消粗体,但这似乎效率很低。关于如何做到这一点,有什么建议吗?
作为一个不错的选项,您可以拥有像DataTable
这样的数据源,该数据源具有字符串Url
和布尔Favorite
列。
然后,将第一个网格绑定到数据表作为其DataSource
。
将第二个网格绑定到从数据表创建的DataView
,并将Favorite=true
设置为其Filter
。
然后处理第一个DataGridView
的RowPrePaint
事件,如果该行有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();
}