4

基になるデータベースにレコードを追加しました。レコードを追加した後、datagridview.Refresh(); を実行します。新しく追加されたレコードが表示されません。

アプリケーションを停止して開始すると、そこにあります。私は何をしているのか、していないのか? 注: button1 と datagridview は別の Forms にあります。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

DB にデータを追加した後、アプリケーションは追加されたデータについて何も知りません。これらのデータをメモリにロードする必要があります。表示するすべてのデータをデータベースから取得し、データベースで操作を行った後に明示的に UI にバインドします。

編集

デバッグ中に ShowAll() が返すものを確認できますか? 本当に必要なデータが返されますか?

WPF アプリケーションの場合は、こちらをご覧ください。ここでの問題は、基になるデータ ソースが変更されたことを UI コンポーネントに伝えて、UI コンポーネントがデータに加えられた変更を反映するようにすることです。

繰り返しますが、WPF アプリケーションの場合は、データを ObservableCollection として定義し、UI をこのコレクションにバインドできます。ObservableCollection は、データが変更されたときに UI の更新を自動的に要求します。

リカ・エデリム)

于 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

datagridview のデータソースとして顧客リストを厳密に使用する必要がない場合は、datatable を使用したはるかに優れたソリューションを次に示します。挿入後に更新された顧客リストとデータグリッドビューを取得します

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

更新パネルを使用したに違いないと思いますが、それを更新していない可能性があります

于 2012-08-23T05:38:32.310 に答える
1

データグリッドビューで EndEdit を呼び出してみてください:

this.dataGridView1.EndEdit();

次に、グリッド ビューを更新します。

this.dataGridView1.Refresh();

それでもうまくいかない場合は、含まれているコントロールで Refresh を呼び出してみてください

ParentControl.Refresh()

これにより、必要な再描画が呼び出されることになります。

于 2012-08-13T13:36:40.857 に答える
1

答えは、グリッドビューをBindingList<Customers>ではなくに接続することList<Customers>です。これで問題が解決することを願っています...

于 2012-08-22T12:50:39.793 に答える
1

これで問題が解決すると思います。これを確認してください........

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

ノート

CommitEdit() メソッドは RowEditEnding イベントを発生させます。これは無限ループです。WPF では、無限ループが発生する可能性があるため、編集中にビューを更新することはできません。ただし、編集後にビューを更新できます。RowEditEnding イベント ハンドラー (If Initialzed) の削除を試み、アイテムの更新を行います。次に、イベント ハンドラーを追加し直します。

于 2012-08-23T05:43:21.917 に答える
1

リストをデータソースとして使用しているようです。一般的なリストを使用しても読み取り専用データには問題ありませんが、あらゆる種類の更新を行うには、より強力なものが必要です。私は 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

すべての新しいレコードではなく、1 回だけデータ バインドを行う必要があります。これが、すべての変更が自動的に反映されるコントロールにデータをバインドすることの要点です。

  1. クラスcustomersのデータ メンバーを作成し CustomerService、コードを適切に変更します。

    class CustomerService {
        List<Customers> customers;
        ...
    }
    
  2. 次に、バインディング コードを 1 回実行する必要があります。最初のレコードが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

List を BindingList に変更すると、成功します。私は、フォーム上に DataGridView といくつかのボタンがあるだけのサンプルをまとめました。

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、リストまたはリスト内の何かが変更されたときに発生するイベントが呼び出されるためです。

于 2012-08-22T15:36:29.067 に答える
1

customerservice.customerAdd の内容は何ですか? 接続を適切に閉じない/データをデータベースにフラッシュしない可能性があり、アプリを閉じたときにのみ発生します(すべてのメモリが破棄され、すべての接続が閉じられます/フラッシュされます)。

また、グリッドがバインドされている BindingSource を使用し、そのデータ ソースを変更することをお勧めします。データ ソースが変更された場合に自動的にグリッドに通知するイベントがあり、それによってグリッドが更新されます。

于 2012-08-16T11:31:20.120 に答える