如何在更新后刷新c#dataGridView?

时间:2011-08-10 09:10:52

标签: c# datagridview

当我点击任何行打开表单以更新行数据时,我有一个dataGridView,但在结束更新后,更新表单已关闭,但dataGridView数据未更新

我该怎么做?

9 个答案:

答案 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;
            }
        }