Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据网格视图赢得';更新后不刷新_C#_.net_Entity Framework_Datagrid - Fatal编程技术网

C# 数据网格视图赢得';更新后不刷新

C# 数据网格视图赢得';更新后不刷新,c#,.net,entity-framework,datagrid,C#,.net,Entity Framework,Datagrid,我正在用c#做简单的数据库客户端。现在我正在使用实体框架,一切似乎都很好,但在向数据库添加新记录后,它不会更新。这是我的密码: private void AddClientConfirmButton_Click(object sender, EventArgs e) { MainForm frm = new MainForm(); var newClient = new Klienci { Imie

我正在用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();
    }
还有一些数据:

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

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

只需设置为null,然后赋值

 BindingSource bs = new BindingSource();
 bs.DataSource = clientList.ToList();
 ClientsDataGridView.DataSource = null;
 ClientsDataGridView.DataSource = bs;
 dataContext.Dispose();
试试这个:

bs.ResetBindings(false);
ClientsDataGridView.DataSource = typeof(List); 
ClientsDataGridView.DataSource = bs;
要像Noceo所说的那样使用ToBindingList(),必须导入System.Data.Entity。 做一些类似于:

DataContext.Klienci.Load()
用于加载所有客户端,以及:

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

链接到数据绑定。之后,它将被更新。

而不是将
列表
分配给您的
BindingSource.DataSource
,而是为其分配一个

您不必每次更新
Klienci
集合时都创建一个新的
BindingSource
。在初始化期间只执行一次,并将
BindingList
分配给
BindingSource.DataSource

以下操作仅在初始化期间执行(InitializeComponent()?)

每当您需要用所有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())
}
使用(var dataContext=new bakkenties())
{
IEnumerable clients=dataContext.Klienci
.Select(客户端=>new Klienci()
{
Imie=client.Imie,
Nazwisko=客户。Nazwisko,
Adres=客户机。Adres,
Telefon=客户机。Telefon,
Email=client.Email,
状态=客户端状态,
});
myBindingsource.DataSource=新的BindingList(clients.ToList())
}
对不起,我使用linq方法语法,我对它比较熟悉。最重要的是将检索到的Klienci序列转换为BindingList,然后将其分配给已经连接到DataGridView.DataSource的BindingSource

您可能会发现以下内容很有用

你注意到我用了一个
using
语句了吗。这是为了确保您的DataContext被释放,即使您有异常


顺便说一下:如果您希望DATAGIDVIEW是可排序的,请考虑使用A。用法与BindingList相同,只是您不知道该类是否存在该方法,但请尝试使用
.ToBindingList()
而不是
.ToList()
它不存在您是否考虑过使用WPF而不是winforms?在您习惯了WPF的数据绑定之后,WPF的数据绑定简直令人惊叹。
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())
}