我已经在底层数据库中添加了一条记录,在我添加记录之后我做了一个 datagridview.Refresh();我没看到新添加的记录。
如果我停止并启动它的应用程序。我在做什么或不在做什么 在做什么? 注意:button1和datagridview在不同的Forms.I中使datagridview的Modifiers公开。这个项目是ado.net项目
public class CustomerService
{
public List<Customers> ShowAll()
{
List<Customers> customers = new List<Customers>();
SqlConnection conn = new SqlConnection("data source=.; database=custer; user id=sa; password=*****");
SqlCommand cmd = new SqlCommand(" select * from Customers ", conn.Open());
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
Customer customer = new Customer ()
{
CustomerID = dr.GetInt32(0),
CustomerName = dr.GetString(1),
CustomerSurname = dr.GetString(2),
};
customers.Add(customer);
}
conn.Close();
return customers;
}
}
private void button1_Click(object sender, EventArgs e)
{
CustomerService service = new CustomerService();
if (txtCustomerName.Text != "" || txtCustomerSurname.Text != "")
{
customerservice.customerAdd(txtCustomerName.Text, txtCustomerSurname.Text);//this rows is other method .I am using for adding new customer
MessageBox.Show("Customer Added");
Form1.dataGridView1.DataSource = service.ShowAll();
Form1.dataGridView1.Refresh();
}
else
{
//……………
}
}
答案 0 :(得分:3)
将数据添加到数据库后,您的应用程序对添加的数据一无所知。您需要将这些数据加载到内存中。从数据库中检索要显示的所有数据,并在对数据库执行操作后将其显式绑定到UI。
修改强>:
您可以查看ShowAll()在调试时返回的内容吗?它会返回您真正想要的数据吗?
如果是WPF应用程序,请查看here。这里的问题是告诉您的UI组件底层数据源已被更改,因此UI组件反映了对数据所做的更改。
如果它是WPF应用程序,您可以将数据定义为ObservableCollection并将UI绑定到此集合。当数据发生变化时,ObservableCollection会自动请求UI刷新。
Rica ederim。)
答案 1 :(得分:2)
通常的做法是重置DataSource
的{{1}}。
尝试使用此代码(使用正确的代码提供正确的数据源):
DataGridView
调用Form1.dataGridView1.DataSource = typeof(List);
Form1.dataGridView1.DataSource = service.ShowAll();
不起作用,因为它只强制重绘,但绘制网格的代码不知道更改。
也参考此WPF链接,这可能对您有所帮助:
Why does the DataGrid not update when the ItemsSource is changed?
答案 2 :(得分:1)
尝试在datagridview上调用EndEdit:
this.dataGridView1.EndEdit();
其次,刷新网格视图:
this.dataGridView1.Refresh();
如果仍然无效,请尝试在包含控件上调用Refresh
ParentControl.Refresh()
这将最终调用可能需要的重绘。
答案 3 :(得分:1)
customerservice.customerAdd的内容是什么? 也许它没有正确关闭连接/没有将数据刷新到数据库中,只有当你关闭应用程序时才会发生(所有内存都被丢弃,所有连接都被关闭/刷新)。
此外 - 我建议使用网格绑定的BindingSource,并更改其数据源 - 它有事件自动通知网格,如果其数据源已更改并将导致刷新。
答案 4 :(得分:1)
正如你所说,它们有不同的形式,我认为指向Form1的指针并不指向你想要的形式。您应该使用this
将该表单的指针传递给此表单。
当您创建表单2时,定义如下:
Form2 = new Form2();
Form2.form1 = this;
然后你的代码应该可以工作。
答案 5 :(得分:1)
您似乎正在使用List作为数据源。我发现使用通用列表对于只读数据是可以的,但是对于进行任何类型的更新,您需要具有更强大功能的东西。我不知道WPF,但在winForms中我使用IBindingList接口和BindingList泛型集合取得了巨大成功。 BindingList泛型集合为您实现IBindingList接口。我会阅读关于它们的MSDN文章。我几乎停止使用IBindingList接口,但它仍然可以很好地实现。
http://msdn.microsoft.com/en-us/library/system.componentmodel.ibindinglist.aspx
答案 6 :(得分:1)
答案是将gridview连接到BindingList<Customers>
而不是List<Customers>
。希望这能解决你的问题...
答案 7 :(得分:1)
如果将List更改为BindingList,您将获得成功。我把一个样本放在一起,它只有一个DataGridView和一个Form上的几个按钮。
button1生成一些假数据并分配数据源。 button2将另一个Customer添加到基础列表。
当底层BindingList发生更改时,DataGridView会更新。
代码:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public string SurName { get; set; }
}
public partial class Form1 : Form
{
BindingList<Customer> customers = new BindingList<Customer>();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; ++i)
{
customers.Add(new Customer
{
Id = i,
Name = "Name" + i,
SurName = "Surname" + i
});
}
dataGridView1.DataSource = customers;
}
private void button2_Click(object sender, EventArgs e)
{
customers.Add(new Customer
{
Id = 22,
Name = "Newname",
SurName = "Newsurname"
});
}
}
现在,它起作用的原因是BindingList<T>
实现了IBindingList
,除此之外,该接口还有一个名为ListChanged
的事件,该事件在列表中引发或列表中的某些内容发生变化。
答案 8 :(得分:1)
如果您不一定严格使用客户列表作为datagridview的数据源 这是使用数据表的更好的解决方案。插入
后,您将获得更新的客户列表和datagridviewpublic class CustomerService
{
public DataTable ShowCustomers()
{
string cns = "data source=.; database=custer; user id=sa; password=*****";
SqlConnection conn = new SqlConnection(cns);
SqlDataAdapter da = new SqDataAdapter("select * from Customers", conn);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}
private void button1_Click(object sender, EventArgs e)
{
CustomerService service = new CustomerService();
if (txtCustomerName.Text != "" || txtCustomerSurname.Text != "")
{
customerservice.customerAdd(txtCustomerName.Text,txtCustomerSurname.Text);
MessageBox.Show("Customer Added");
DataTable dt = service.ShowCustomers();
Form1.dataGridView1.DataSource = dt;
//If you also need customer list. Provide the DataTable and get list
List<Customers> customers = new List<Customers>();
for (int i=0;i<dt.Rows.Count;i++)
{
Customer customer = new Customer();
customer.CustomerID = Convert.ToInt32(dt.Rows[i][0]);
customer.CustomerName = dt.Rows[i][1].ToString();
customer.CustomerSurname = dt.Rows[i][2].ToString();
customers.Add(customer);
}
}
}
答案 9 :(得分:1)
您只需要对每个新记录执行一次数据绑定。这是将数据绑定到控件的全部要点,所有更改都将自动反映。
让customers
成为CustomerService
类的数据成员并正确更改代码:
class CustomerService {
List<Customers> customers;
...
}
接下来,绑定代码应该完成一次,也许当第一条记录添加到List<Customers>
时。
BindingSource binding = new BindingSource();
binding.DataSource = customers;
dataGridView1.DataSource = binding;
如果你做得对,每次删除或添加到客户集合中的任何记录时,都应该自动反映在DataGridView
控件中。
答案 10 :(得分:1)
我认为您必须使用更新面板,可能无法刷新
答案 11 :(得分:1)
我认为这会解决您的问题,请检查此........
DataGrid.CommitEdit();
DataGrid.Items.Refresh();
注意强>
CommitEdit()方法将触发RowEditEnding事件,它是无限循环。 WPF不允许在编辑时刷新视图,因为它可能发生无限循环。但是,您可以在编辑后刷新视图。尝试删除RowEditEnding事件处理程序(如果已初始化),并为Items执行刷新;然后添加事件处理程序: