刷新DataSource并更新GridControl

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷新DataSource并更新GridControl相关的知识,希望对你有一定的参考价值。

我会试着在这里解释我的问题......

我使用2种形式。第一个具有下拉菜单和网格控件,在下拉菜单中选择项目后填充。在填充gridControl之后,我有一个按钮来添加包含数据的新行。当我单击它时,将打开一个新表单,其中textFields将填充,并保存按钮以保存更改并刷新gridControl。以下是第一个表单中的代码,其中gridControl在dropDown菜单中的select项之后填充:

private void ddScoreType_EditValueChanged(object sender, EventArgs e)
    {
        ddScoreTypeSelectedID = Convert.ToInt32((sender as LookUpEdit).EditValue);
        try
        {
            gcScoreParam.DataSource = null;
            gvScoreParam.Columns.Clear();
            selectedScoreType = _db.ScoreTypes.Where(x => x.ID == ddScoreTypeSelectedID).SingleOrDefault();
            gcScoreParam.DataSource = selectedScoreType.ScoreParams.ToList();

            gvScoreParam.Columns.AddVisible("Name", "Name");
            gvScoreParam.Columns.AddVisible("Code", "Code");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

这工作正常......这是我的第二个输入表单中的代码,我应该添加新数据并以第一种形式刷新gridControl:

private void btnSave_Click(object sender, EventArgs e)
    {
        //XtraMessageBox.Show("ID - " + _ScoresTypeID);
        db = new BetEntities();
        ScoreParam param = new ScoreParam();

        db.ScoreParams.Add(param);
        param.ScoreTypeID = _ScoresTypeID;
        param.Name = txtScoreName.Text;
        param.Code = txtScoreCode.Text.ToUpper();

        db.SaveChanges();

        frmScoreType frmST = new frmScoreType();
        frmST.RefreshGVParams(db);

        this.Close();
    }

db是我的数据库,ScoreParam是表。这是方法RefreshGVParams:

public void RefreshGVParams(BetEntities be)
    {
        //gvScoreParam.BeginDataUpdate();
        gcScoreParam.BeginUpdate();
        try
        {
            gcScoreParam.DataSource = null;      // this line DOES NOT set datasource to null
            selectedScoreType = be.ScoreTypes.Where(x => x.ID == ddScoreTypeSelectedID).SingleOrDefault();
            gcScoreParam.DataSource = selectedScoreType.ScoreParams.ToList();
            gvScoreParam.Columns.Clear();
            gvScoreParam.Columns.AddVisible("Name", "Name");
            gvScoreParam.Columns.AddVisible("Code", "Code");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        { 
            gcScoreParam.EndUpdate();
            //gvScoreParam.EndDataUpdate();
        }
    }

我评论了没有将dataSource设置为null的行,并且没有使用新数据刷新gridcontrol ...当我关闭我的第一个表单并再次启动它时,我看到它刷新了新数据...

如何在第二种形式中单击“保存”按钮后以第一种形式刷新gridControl?我在哪里做错了?

很抱歉很长的帖子,但已经2天了,因为我无法解决这个问题...我希望我解释得很好:)

答案

假设您的第二个表单名称为Form2,请在“添加新行”按钮单击事件中添加/替换以下代码

Form2 f2 = new Form2();
f2.ShowDialog();
RefreshGVParams((BetEntities)f2.Tag);

在您的Form2上将btnSave_Click代码更改为

private void btnSave_Click(object sender, EventArgs e)
{        
    db = new BetEntities();
    ScoreParam param = new ScoreParam();

    db.ScoreParams.Add(param);
    param.ScoreTypeID = _ScoresTypeID;
    param.Name = txtScoreName.Text;
    param.Code = txtScoreCode.Text.ToUpper();

    db.SaveChanges();

    this.Tag = db; 

    this.Close();
}
另一答案

在btnSave_Click中,当您创建新的表单对象frmScoreType frmST = new frmScoreType();时,您不再引用第一个打开的表单。在你的情况下,gcScoreParam.DataSource = null;为你创建的新对象设置数据源为null,而不是为打开的表单设置数据源。尝试使用(frmScoreType)Application.OpenForms["frmScoreType"].RefreshGVParams(db);,现在您的函数RefreshGVParams将由打开的表单执行。或者你也可以控制你打开的表格,如下所示:frmScoreType f = (frmScoreType)Application.OpenForms["frmScoreType"]并首先检查f == null(看看你的表格是否打开,然后打电话给f.RefreshGVParams(db);请原谅我的英语。希望它有所帮助。

以上是关于刷新DataSource并更新GridControl的主要内容,如果未能解决你的问题,请参考以下文章

更新数据源时刷新数据网格

刷新剑道网格,选择框

C# DataGridView List集合 刷新

DataSource和DataSourceID都在'GridView1'上定义。删除一个定义

内联更新后,Kendo Treelist重新加载/刷新

XtraGrid 在更新其数据源后不刷新