おそらく両方のグリッドに異なる DataSource を使用していることに気付きましたが、同じデータベースを指していますよね? 以下の例では、両方のグリッドに同じデータソースを使用しています。ただし、一部の列を非表示にすることで、詳細ビューと通常ビューを比較しました。この戦略で問題を解決できるのではないでしょうか?
私が最初に考えたのは、SelectionChanged イベントを実装するか、そうでない場合は SelectionChanging イベントを実装することでした。そこにリフレッシュを入れてください。しかし、私はそのようにすることにはなりませんでした。
以下のような小さなプログラムを書きました。削除ではない限り、行の変更とともに編集をディスクに保存します(ボタンをクリックすると、削除コマンドでnullポインタ例外が発生し、編集の削除を保存するのに問題がありました)。また、プログラムを閉じる直前に変更を保存します (削除された行も保存されるように)。deleteOne ボタンと deleteTwo ボタン (それぞれ 1 番目または 2 番目のグリッドから削除する) を使用すると、実際には両方のグリッドで削除が行われることがわかりました。あなたの状況で動作する場合、radGridView1.Rows.Remove(row) または RemoveAt(i) コマンドを使用できる可能性はありますか?
もう 1 つの可能性は、更新が機能しない場合、DataSource を null に設定し、行を削除した後にデータ ソースに再度設定することです。これは少し抜本的ですが、それが機能する唯一のものである場合はどうなりますか? 両方のグリッドのデータ ソースについて話しています。
私のコードは以下の通りです:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Telerik.WinControls;
using Telerik.WinControls.Data;
using Telerik.WinControls.UI;
namespace RadControlsWinFormsApp1
{
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
public RadForm1()
{
InitializeComponent();
}
private void RadForm1_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'testdbDataSet.Customers' table. You can move, or remove it, as needed.
this.customersTableAdapter.Fill(this.testdbDataSet.Customers);
radGridView1.Columns["Address"].IsVisible = false;
}
private void radGridView1_RowsChanged(object sender, Telerik.WinControls.UI.GridViewCollectionChangedEventArgs e)
{
// if removing don't update, because if my delete button is pressed this
// will otherwise cause all sorts of problems and freezes the grid
if (e.Action != NotifyCollectionChangedAction.Remove)
{
try
{
customersTableAdapter.Update(testdbDataSet);
}
catch (DBConcurrencyException ex)
{
// unable to save right now, don't worry about it
}
}
radGridView2.Refresh();
}
private void butDeleteOne_Click(object sender, EventArgs e)
{
bool haveRemoved = false;
for (int i = 0; i < radGridView1.Rows.Count && !haveRemoved; ++i)
{
GridViewRowInfo row = radGridView1.Rows[i];
if (row.IsSelected)
{
haveRemoved = true;
radGridView1.Rows.RemoveAt(i);
}
}
}
private void butDeleteTwo_Click(object sender, EventArgs e)
{
bool haveRemoved = false;
for (int i = 0; i < radGridView2.Rows.Count && !haveRemoved; ++i)
{
GridViewRowInfo row = radGridView2.Rows[i];
if (row.IsSelected)
{
haveRemoved = true;
radGridView2.Rows.RemoveAt(i);
}
}
}
private void radGridView2_RowsChanged(object sender, GridViewCollectionChangedEventArgs e)
{
// if removing don't update, because if my delete button is pressed this
// will otherwise cause all sorts of problems and freezes the grid
if (e.Action != NotifyCollectionChangedAction.Remove)
{
try
{
customersTableAdapter.Update(testdbDataSet);
}
catch (DBConcurrencyException ex)
{
// unable to save right now, don't worry about it
}
}
radGridView1.Refresh();
}
private void RadForm1_FormClosing(object sender, FormClosingEventArgs e)
{
// ensure all data is saved back into database on close
customersTableAdapter.Update(testdbDataSet);
}
//private void radGridView1_CellEndEdit(object sender, Telerik.WinControls.UI.GridViewCellEventArgs e)
//{
//}
}
}