简体   繁体   English

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

[英]Data Grid View won't refresh after updating

I am doing simple database client in c#. 我在用C#做简单的数据库客户端。 Right now I'm using entity framework, everything seems to be fine, but after adding a new record to database it won't update. 现在我正在使用实体框架,一切似乎都很好,但是在向数据库中添加新记录后,它不会更新。 Here's my code : 这是我的代码:

        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();
    }

Here's UpdateDb method: 这是UpdateDb方法:

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

And there's 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();
    }

I have to run my program again if I want to refresh data, and that's not so comfortable 如果要刷新数据,我必须再次运行程序,这不太舒服

Just set to null and then assign the value, 只需设置为null然后分配值,

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

Try this: 尝试这个:

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

To use ToBindingList() like Noceo said, you have to import System.Data.Entity. 要像Noceo所说的那样使用ToBindingList(),必须导入System.Data.Entity。 do something like : 做类似的事情:

DataContext.Klienci.Load()

For loading all the clients, and : 用于加载所有客户端,以及:

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

To link to your data binding. 链接到您的数据绑定。 After that, it will updated. 之后,它将进行更新。

Instead of assigning a List<T> to your BindingSource.DataSource , assign a BindingList to it. 而不是给您的BindingSource.DataSource分配一个List<T> ,而是为其分配一个BindingList

You don't have to create a new BindingSource every time you want to update the collection of Klienci for you DataGridView . 您不必每次想为DataGridView更新Klienci的集合时都创建一个新的BindingSource Do this only once during initialization and assign the BindingList<T> to the BindingSource.DataSource 在初始化期间仅执行一次,并将BindingList<T>分配给BindingSource.DataSource

The following is only done during initialization (InitializeComponent()?) 仅在初始化期间执行以下操作(InitializeComponent()?)

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

Whenever you need to re-fill your DataGridView with all your Klienci: 每当您需要用所有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())
}

Sorry I use linq method-syntax, I'm more familiar with that. 抱歉,我使用linq方法语法,对此我更加熟悉。 The main importance is that you convert your retrieved sequence of Klienci into a BindingList and then assign that to the BindingSource that is already connected to the DataGridView.DataSource. 最重要的是将检索到的Klienci序列转换为BindingList,然后将其分配给已连接到DataGridView.DataSource的BindingSource。

You might find the following useful Stackoverflow: List vs BindingList Advantages/DisAdvantages 您可能会发现以下有用的Stackoverflow:列表vs BindingList的优点/缺点

Did you notice I used a using statement. 您是否注意到我使用了using语句。 This is to make sure your DataContext is disposed, even if you have an exception. 这是为了确保您的DataContext被处置,即使您有异常也是如此。

By the way: if you want your datagridview to be sortable, consider using a SortableBindingList . 顺便说一句:如果您希望datagridview是可排序的,请考虑使用SortableBindingList Usage is the same as a BindingList, except that you 用法与BindingList相同,除了

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM