我有2个Telerik的rad网格。第一个是主人,第二人是细节。我可以通过按每个网格上方工具栏上的“删除”按钮来独立删除两个网格中的行。我在两个网格的工具栏中也有“刷新”按钮。
问题在于细节网格。当我删除项目时,网格不会刷新。调用Rebind方法没有帮助。唯一有帮助的是按主网格工具栏中的“刷新”按钮,然后通过之前选择的鼠标选择主网格中的行。之后我可以看到刷新的细节网格。
因此,我不需要按主网格工具栏中的“刷新”按钮,并通过鼠标选择主网格中的行。我可以通过编程方式刷新主网格,并且只想以编程方式重新选择最初选择的项目。我试过这个:
item.Selected = true;
但是,它只能直观地选择主网格中的项目,而不会刷新细节网格。
那么,如何以编程方式选择主网格中的项目以获得与通过鼠标选择它相同的效果?
提前谢谢。
答案 0 :(得分:0)
我刚刚意识到您可能为两个网格使用不同的DataSource,但指向同一个数据库,对吧?我的示例下面对两个网格使用相同的数据源。但是我通过使一些列不可见而在详细视图与普通视图上进行了对比。也许这种策略可以解决您的问题?
我的第一个想法是尝试实现SelectionChanged事件,如果没有,则尝试实现SelectionChanging事件。在你看到的地方刷新。但我并没有这样做。
我写了一个小程序,如下所示。只要不是删除,它就会将编辑内容保存到磁盘,只要它不是删除(我在单击按钮时保存删除编辑时遇到问题)它在remove命令上给出了空指针异常。它还在关闭程序之前保存更改(这样任何删除行也会保存)。我确实发现deleteOne和deleteTwo按钮(分别从第一个或第二个网格中删除)确实导致在两个网格中都发生删除。所以你有可能使用radGridView1.Rows.Remove(row)或RemoveAt(i)命令,如果它适合你的情况吗?
另一种可能性是,如果刷新不起作用,您可以将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)
//{
//}
}
}