我在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();
}
如果我想刷新数据,我必须再次运行我的程序,这不太舒服
答案 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相同