4

我已经向底层数据库添加了一条记录,添加记录后我执行了 datagridview.Refresh(); 而且我没有看到新添加的记录。

如果我停止并启动应用程序,它就在那里。我在做什么或不做什么?注意:button1 和 datagridview 的形式不同。我公开了 datagridview 的修饰符。这个项目是 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
        {
            //……………
        }
    }
4

12 回答 12

3

将数据添加到数据库后,您的应用程序对添加的数据一无所知。您需要将这些数据加载到内存中。在对数据库执行操作后,从数据库中检索要显示的所有数据并将其显式绑定到 UI。

编辑

你能在调试时检查 ShowAll() 返回的内容吗?它会返回您真正想要的数据吗?

如果它是 WPF 应用程序,请查看此处。这里的问题是告诉您的 UI 组件底层数据源已更改,因此 UI 组件反映对数据所做的更改。

同样,如果它是 WPF 应用程序,您可以将数据定义为 ObservableCollection 并将您的 UI 绑定到此集合。ObservableCollection 在数据发生变化时自动请求 UI 刷新。

Rica ederim。)

于 2012-08-14T07:07:43.400 回答
2

这样做的通常方法是重置DataSource.DataGridView

试试这个代码(使用正确的代码来提供正确的数据源):

Form1.dataGridView1.DataSource = typeof(List); 
Form1.dataGridView1.DataSource = service.ShowAll();

调用.Refresh()不起作用,因为它只强制重新绘制,但绘制网格的代码不知道更改。

也请参考此 WPF 链接,这可能会对您有所帮助:

为什么更改 ItemsSource 时 DataGrid 不更新?

于 2012-08-13T14:11:55.053 回答
1

您只需要对每条新记录进行一次数据绑定。这就是将数据绑定到所有更改都会自动反映的控件的全部意义。

  1. customers创建该类的数据成员 并适当地更改CustomerService您的代码:

    class CustomerService {
        List<Customers> customers;
        ...
    }
    
  2. 接下来绑定代码应该完成一次,可能是在将第一条记录添加到List<Customers>.

    BindingSource binding = new BindingSource();
    binding.DataSource = customers;
    dataGridView1.DataSource = binding;
    

如果您已正确执行此操作,则每次删除或添加到客户集合中的任何记录时,都应自动反映在DataGridView控件中。

于 2012-08-22T23:25:44.790 回答
1

正如你所说,这些形式不同,我认为指向 Form1 的指针并不指向你想要的形式。您应该将该表单的指针传递this给该表单。

当您创建表单 2 时,定义如下:

Form2 = new Form2();
Form2.form1 = this; 

然后你的代码应该可以工作。

于 2012-08-20T21:43:21.483 回答
1

customerservice.customerAdd 的内容是什么?也许它没有正确关闭连接/没有将数据刷新到数据库中,并且仅在您关闭应用程序时才会发生(所有内存都已释放,并且所有连接都已关闭/刷新)。

另外 - 我建议使用网格绑定到的 BindingSource 并更改其数据源 - 如果其数据源已更改并且将导致其刷新,它具有自动通知网格的事件。

于 2012-08-16T11:31:20.120 回答
1

看来您正在使用 List 作为数据源。我发现使用通用列表对于只读数据是可以的,但对于进行任何类型的更新,您需要更强大的东西。我不了解 WPF,但在 winForms 中,我在 IBindingList 接口和 BindingList 泛型集合方面取得了巨大成功。BindingList 泛型集合为您实现了 IBindingList 接口。我会阅读关于它们的 MSDN 文章。我几乎已经停止使用 IBindingList 接口,但它仍然可以很好地实现。

http://msdn.microsoft.com/en-us/library/system.componentmodel.ibindinglist.aspx

http://msdn.microsoft.com/en-us/library/ms132679.aspx

于 2012-08-21T19:00:07.717 回答
1

如果您将 List 更改为 BindingList,您将获得成功。我将一个示例放在一起,该示例在表单上只有一个 DataGridView 和几个按钮。

button1 生成一些假数据并分配数据源。button2 将另一个客户添加到基础列表中。

DataGridView 会在基础 BindingList 更改时更新。

代码:

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,当列表或列表中的某些内容发生更改时会引发该事件。

于 2012-08-22T15:36:29.067 回答
1

我想这会解决你的问题,检查这个......

DataGrid.CommitEdit();
DataGrid.Items.Refresh();

笔记

CommitEdit() 方法将触发 RowEditEnding 事件,这是一个无限循环。WPF 不允许在编辑时刷新视图,因为它可能会发生无限循环。但是,您可以在编辑后刷新视图。尝试删除 RowEditEnding 事件处理程序 (If Initialzed) ,并刷新项目;然后重新添加事件处理程序:

于 2012-08-23T05:43:21.917 回答
1

我认为您一定使用过更新面板并且可能不会刷新它

于 2012-08-23T05:38:32.310 回答
1

尝试在 datagridview 上调用 EndEdit:

this.dataGridView1.EndEdit();

二、刷新网格视图:

this.dataGridView1.Refresh();

如果这仍然不起作用,请尝试在包含控件上调用 Refresh

ParentControl.Refresh()

这最终会调用可能需要的重绘。

于 2012-08-13T13:36:40.857 回答
1

如果您不必严格使用客户列表作为 datagridview 的数据源,那么这里是使用数据表的更好的解决方案。插入后您将获得更新的客户列表和 datagridview

public 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);
      }
   }
}
于 2012-08-22T21:06:46.797 回答
1

答案是让 gridview 连接到BindingList<Customers>而不是List<Customers>. 希望这能解决您的问题...

于 2012-08-22T12:50:39.793 回答