数据网格视图在更新后不会刷新

时间:2017-06-12 11:18:21

标签: c# .net entity-framework datagrid

我在c#中做简单的数据库客户端。现在我使用实体框架,一切似乎都很好,但在向数据库添加新记录后,它不会更新。这是我的代码:

        private void AddClientConfirmButton_Click(object sender, EventArgs e)
    {
        MainForm frm = new MainForm();
        var newClient = new Klienci
        {
            Imie = FirstNameTextBox.Text,
            Nazwisko = LastNameTextBox.Text,
            Adres = AdressTextBox.Text,
            Telefon = TelephoneTextBox.Text,
            Email = EmailTextBox.Text,
            Status = StatusComboBox.Text
        };
        frm.UpdateDb(newClient);
        Close();
    }

这里的UpdateDb方法:

        public void UpdateDb(Klienci newClient)
    {
        var dataContext = new BAKKEntities();
        dataContext.Klienci.Add(newClient);
        dataContext.SaveChanges();
        dataContext.Dispose();
        LoadData();
    }

还有LoadData:

        public void LoadData()
    {
        var dataContext = new BAKKEntities();
        var clientList = from r in dataContext.Klienci
                         select new
                         {
                             Imie = r.Imie,
                             Nazwisko = r.Nazwisko,
                             Adres = r.Adres,
                             Telefon = r.Telefon,
                             Email = r.Email,
                             Status = r.Status,
                         };
        BindingSource bs = new BindingSource();
        bs.DataSource = clientList.ToList();
        ClientsDataGridView.DataSource = bs;
        dataContext.Dispose();
    }

如果我想刷新数据,我必须再次运行我的程序,这不太舒服

4 个答案:

答案 0 :(得分:0)

只需设置为null,然后分配值

 BindingSource bs = new BindingSource();
 bs.DataSource = clientList.ToList();
 ClientsDataGridView.DataSource = null;
 ClientsDataGridView.DataSource = bs;
 dataContext.Dispose();

答案 1 :(得分:0)

试试这个:

bs.ResetBindings(false);
ClientsDataGridView.DataSource = typeof(List); 
ClientsDataGridView.DataSource = bs;

答案 2 :(得分:0)

要使用像Noceo所说的ToBindingList(),你必须导入System.Data.Entity。 做类似的事情:

DataContext.Klienci.Load()

用于加载所有客户端,并且:

bs.Datasource = DataContext.Klienci.Local.ToBindingList()

链接到您的数据绑定。之后,它会更新。

答案 3 :(得分:0)

不是为List<T>分配BindingSource.DataSource,而是为其分配BindingList

每次要为BindingSource更新Klienci的集合时,您无需创建新的DataGridView。在初始化期间仅执行一次,并将BindingList<T>分配给BindingSource.DataSource

以下内容仅在初始化期间完成(InitializeComponent()?)

DataGridView myDataGridView = new DataGridView();
BindingSouce myBindingSource = new BindingSource();
myDataGridView.DataSource = myBindingSource();

每当您需要使用所有Klienci重新填充DataGridView时:

using (var dataContext = new BAKKEntities())
{
    IEnumerable<Klienci> clients = dataContext.Klienci
        .Select(client => new Klienci()
        {
            Imie = client.Imie,
            Nazwisko = client.Nazwisko,
            Adres = client.Adres,
            Telefon = client.Telefon,
            Email = client.Email,
            Status = client.Status,
         });
     myBindingsource.DataSource = new BindingList<Klienci>(clients.ToList())
}

抱歉,我使用linq方法语法,我对此更熟悉。最重要的是您将检索到的Klienci序列转换为BindingList,然后将其分配给已连接到DataGridView.DataSource的BindingSource。

您可能会发现以下有用的Stackoverflow: List vs BindingList Advantages/DisAdvantages

您是否注意到我使用了using声明。这是为了确保您的DataContext被处置,即使您有例外。

顺便说一句:如果您希望datagridview可以排序,请考虑使用SortableBindingList。除了你

之外,用法与BindingList相同