2016-01-07 6 views
1

Вот что я пытаюсь выполнить:Каков наиболее эффективный способ синхронизации двух datagridviews?

У меня есть два datagriddviews. В списке Datagridview1 содержится список URL-адресов. Datagridview2 - это в основном система закладок. Пользователь может щелкнуть правой кнопкой мыши по URL-адресу в datagridview1 и выбрать в избранное или «пометить» его. Затем эта строка будет скопирована в datagridview2. Затем шрифт в строке на datagridview1 станет полужирным, чтобы показать, что он был избран и добавлен в datagridview2. Как сохранить эти две синхронизации? Например, если пользователь удаляет избранное в datagridview2, он должен быть нерасширенным на datagridview1, поскольку он больше не является фаворитом. Какой эффективный способ сохранить эти 2 синхронизированы друг с другом, поскольку индексы будут отличаться? Я проделал только перебор по каждой строке, чтобы убедиться, что строки содержимого ячейки равны, а затем отстегивает ее на основе этого, но это кажется очень неэффективным. Любые предложения о том, как это сделать?

ответ

1

В качестве хорошей опции у вас может быть источник данных, например, DataTable и строка Url и bool Favorite.

Затем привяжите первую сетку к таблице данных как ее DataSource.

Привяжите вторую сетку к DataView, которую вы создали из таблицы данных, и установите Favorite=true как ее Filter.

Затем обработайте RowPrePaint событие первого DataGridView и установите шрифт, который должен быть полужирным, если строка имеет номер favorite=true, а затем установите шрифт регулярным.

Чтобы добавить кнопку и удалить кнопку, установите значение столбца 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(); 
} 
+1

То, что мне нужно, спасибо! –

+0

Добро пожаловать :) –

Смежные вопросы