当我点击任何行打开表单以更新行数据时,我有一个dataGridView,但在结束更新后,更新表单已关闭,但dataGridView数据未更新
我该怎么做?
答案 0 :(得分:35)
BindingSource
是没有第三方ORM的唯一途径,它最初可能看起来很长,但BindingSource
上的一种更新方法的好处是如此有用。
如果您的来源是例如用户字符串列表
List<string> users = GetUsers();
BindingSource source = new BindingSource();
source.DataSource = users
dataGridView1.Datasource = source;
然后,当您完成编辑时,只需更新您的数据对象,无论是DataTable
还是用户字符串列表,例如此处ResetBindings
上的BindingSource
;
users = GetUsers(); //Update your data object
source.ResetBindings(false);
答案 1 :(得分:31)
将DatagridView重新绑定到源。
DataGridView dg1 = new DataGridView();
dg1.DataSource = src1;
// Update Data in src1
dg1.DataSource = null;
dg1.DataSource = src1;
答案 2 :(得分:0)
我不知道这是否真的已经解决了......但是通过查看所有其他答案,似乎没有什么是清楚的。我发现这样做的最好方法是使用相同的代码,用于将datagridview
填充到方法中并将其传递给表单datagridview
,如下所示:
public void ConnectAndPopulateDataGridView(DataGridView dataGridView)
{ }
方法中的代码与用于最初填充datagirdview
的代码完全相同,只是datagridview
名称更改为您在方法中调用的任何名称。
现在,在父表单中调用此方法。
子表单是通过.ShowDialog()
启动的,然后调用该方法,以便在关闭子项后立即调用它...如下所示:
ChildForm.ShowDialog();
ConnectAndPopulateDataGridView(dataGridView1);
答案 3 :(得分:0)
您可以使用DataGridView刷新方法。但是...在许多情况下,您必须从与运行DataGridView的线程不同的线程上运行的方法刷新DataGridView。为此,您应该实现以下方法并调用它,而不是直接键入DataGridView.Refresh():
private void RefreshGridView()
{
if (dataGridView1.InvokeRequired)
{
dataGridView1.Invoke((MethodInvoker)delegate ()
{
RefreshGridView();
});
}
else
dataGridView1.Refresh();
}
答案 4 :(得分:0)
我知道我参加晚会很晚,但是希望这可以帮助那些在班级绑定上也做同样的事情的人
var newEntry = new MyClassObject();
var bindingSource = dataGridView.DataSource as BindingSource;
var myClassObjects = bindingSource.DataSource as List<MyClassObject>;
myClassObjects.Add(newEntry);
bindingSource.DataSource = myClassObjects;
dataGridView.DataSource = null;
dataGridView.DataSource = bindingSource;
dataGridView.Update();
dataGridView.Refresh();
答案 5 :(得分:0)
我知道那是一个古老的话题,但是我突然发现做到这一点的最佳方法,并且不需要取消数据源并重新分配它。 只需使用BindingList而不是List。
例如:
//declare your list
private BindingList<myclass> mMyList = new BindingList<myclass>();
//then bind it to your datagrid, i usually do it on the Load event
private void Form1_Load(object sender, EventArgs e)
{
_dgMyDatagrig.DataSource = mMyList;
}
//start populating your list
private void addItem(mycclass item)
{
mMylist.add(item);
//the datagrid will show automatically the new added/updated items, no need to do anything else
}
答案 6 :(得分:0)
我使用DataGridView的Invalidate()
函数。但是,这将刷新整个DataGridView。如果要刷新特定行,请使用dgv.InvalidateRow(rowIndex)
。如果要刷新特定的单元格,可以使用dgv.InvalidateCell(columnIndex, rowIndex)
。当然,这是假设您使用的是绑定源或数据源。
答案 7 :(得分:-1)
您只需重新定义数据源即可。因此,如果你有例如DataGridView的DataSource包含a,b,i c:
DataGridView.DataSource = a, b, c
突然你更新了DataSource,所以你只有a和b,你需要重新定义你的DataSource:
DataGridView.DataSource = a, b
我希望你觉得这很有用。
谢谢。
答案 8 :(得分:-1)
您可以使用SqlDataAdapter更新DataGridView
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlDataAdapter ad = new SqlDataAdapter("SELECT * FROM Table", conn))
{
DataTable dt = new DataTable();
ad.Fill(dt);
dataGridView1.DataSource = dt;
}
}