Zach Johnson
Zach Johnson

Reputation: 2237

What is the most efficient way to sync two datagridviews?

Here is what I am trying to accomplish:

I have two datagriddviews. Datagridview1 holds a list of urls. Datagridview2 is basically a bookmarking system. A user can right-click on a url in datagridview1 and select to favorite or "bookmark" it. That row will then be copied to datagridview2. The font on the row on datagridview1 will then become bolded to show that it has been favorited and added to datagridview2. How do I keep these two synced? For example if a user removes a favorite on datagridview2 it should become unbolded on datagridview1 as it is no longer a favorite. What is an efficient way to keep these 2 synced to each other since the indexes will be different? I Had through about just iterating through each row to see if the cell content strings were equal and then unbolding it based off that but that seems very inefficient. Any suggestions on how to accomplish this?

Upvotes: 2

Views: 1348

Answers (1)

Reza Aghaei
Reza Aghaei

Reputation: 125197

As a good option you can have a data source like a DataTable having and string Url and a bool Favorite column.

Then, bind the first grid to the data table as its DataSource.

Bind the second grid to a DataView that you created from your data table and set Favorite=true as its Filter.

Then handle RowPrePaint event of first DataGridView and set the font to be bold if the row has favorite=true, else set the font to be regular.

For add button and remove button, set the value of favorite column on data row behind the current row and then call EndEdit on data row.


Initialization

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

Add and Remove Buttons

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

Upvotes: 1

Related Questions