2011-09-14 9 views
1

こんにちは私はいくつかの記事を読んでいますが、私が求める答えは得られません。私は2倍の処理をしたいと思っています。 1.クエリーからデータグリッドビューを取り込みます。クエリーを実行するボタンを使用してテーブルに直接移入するのではなく、テーブルに移入します。 2.データグリッドの値を変更してデータベースに戻ると、変更が反映されます。私が遭遇している問題は、変化するかもしれない静的な宇宙を持っていないと仮定していると見なす例です。私はすでに人口の部分を知っていましたが、データベースへの接続に「datagridviewをどのように使用しているのか不思議です。私が現時点で示していることを変更して元のデータベースに保存してください。Windowsフォームの結果の変更をSQLデータベースに取り込むDataGridView

コード私はわずかに従いました: http://www.switchonthecode.com/tutorials/csharp-tutorial-binding-a-datagridview-to-a-database彼らはAccessメソッドを使用していましたが、SQLを使用していますが、それほど重要ではありません。

EG:1つのプロセスインスタンスにdataAdapter要素を設定できますが、もう1つのインスタンスはそれを認識できません。私はあなたがデータセットでドラッグアンドドロップすることでこれらを非常に簡単に行うことができるので、何かができると考えています。たぶん私は間違っていると思いますし、静的な要素や動的な要素を設定する必要があります。私が本当に望むのは、VALUEの値を別のものに変更して、バインディング元のデータベースに戻すことができることを証明することです。しかし、バインディングソースは別のインスタンスでは不明であり、いくつかのものを静的に設定すると、それらを定義した方法で失敗しました。どんな助けも大変ありがとう!ありがとう!

PRE SET UP:

  1. として定義され、単一のテーブルと 'テスト' データベースの作成:

    表テスト(ID int型アイデンティティ、VALUEのVARCHAR(2))を作成 テストに挿入

  2. Visual Studio 2010でWindowsフォームアプリケーションを作成する(明示的に何もしていないと思われるため、2008年以前に動作するはずです) .NET 4.0)。 Windowsフォームには2つのボタンが必要です。 'btnPopulate' b。 'btnUpdate';テキストボックス: 'txtquery'はテキストで埋められます: 'select * from Test';とdatagridview: 'gridview'です。

フォームの後ろに使用される実際のコード:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace DataGridTestDBUpdater 
{ 
    public partial class TestDataGrid : Form 
    { 
     public string con = "Integrated Security=SSPI;Persist Security Info=False;Data Source =(local);Initial Catalog=Test"; 

     public TestDataGrid() 
     { 
      InitializeComponent(); 
     } 

     private void btnPopulate_Click(object sender, EventArgs e) 
     { 
      string query = txtquery.Text; 

      using (SqlConnection cn = new SqlConnection(con)) 
      { 
       using (SqlCommand cmd = new SqlCommand(query, cn)) 
       { 
        using (SqlDataAdapter adapter = new SqlDataAdapter()) 
        { 
         using (DataTable table = new DataTable()) 
         { 
          cn.Open(); 

          using (BindingSource bs = new BindingSource()) 
          { 
           adapter.SelectCommand = cmd; 

           adapter.Fill(table); 

           bs.DataSource = table; 

           gridview.DataSource = bs.DataSource; 
          } 

          cn.Close(); 
         } 
        } 
       } 
      } 
     } 

     private void btnUpdate_Click(object sender, EventArgs e) 
     { 
      using (BindingSource bs = new BindingSource()) 
      { 
       bs.DataSource = gridview.DataSource; 

       using (DataTable table = new DataTable()) 
       { 
        using(SqlDataAdapter adpt = new SqlDataAdapter()) 
        { 
         bs.DataSource = gridview.DataSource; 

         /// ALL OF MY WORK IS FAILING FROM HERE ON /// 
         /// WANT TO GET UPDATE TO WORK HERE: /// 
         /// 

         ///adpt.Update(bs.DataSource); 

        } 
       } 
      } 

     } 
    } 
} 

答えて

0

私はそれを理解しただけで、SqldataAdapterとBindingSourceのプライベートインスタンスを設定する必要があります。そして、あるインスタンスはもう一方のインスタンスを知ります。加えて、(使用)参照を使用してはいけません。ほとんどの場合、disposeメソッドを実装するのが賢明な選択ですが、このインスタンスでは、私が人口で宣言したインスタンスを見る別のメソッドが必要です。 Answer(これは、主キーを定義していない複数のテーブルやテーブルで動作しません)。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlClient; 

namespace TestEntryForm 
{ 
    public partial class Form1 : Form 
    { 
     private BindingSource bs = new BindingSource(); 
     private SqlDataAdapter da = new SqlDataAdapter(); 
     private string cnc = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Test;Data Source=localhost"; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      datadridview.DataSource = bs; 
     } 

     private void SelectCommand(string selectcmd) 
     { 
      da = new SqlDataAdapter(selectcmd, cnc); 

      SqlCommandBuilder commandBuilder = new SqlCommandBuilder(da); 

      DataTable table = new DataTable(); 

      table.Locale = System.Globalization.CultureInfo.InvariantCulture; 
      da.Fill(table); 
      bs.DataSource = table; 

      datadridview.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader); 

     } 

     private void btnLoad_Click(object sender, EventArgs e) 
     { 
      SelectCommand(txtQuery.Text); 
     } 

     private void btnUpdate_Click(object sender, EventArgs e) 
     { 
      da.Update((DataTable)bs.DataSource); 
     } 
    } 
} 
0

私はあなたの質問を誤解している可能性があります。そのような場合は、自由に修正してください。私が収集したものから、データベースへのあなたのアプリケーションのための非常に永続的な接続が必要です。つまり、アプリケーションのあるインスタンスで何かが変更された場合、他のインスタンスは自動的に変更を認識し、基礎となるデータの表示をリフレッシュする必要があります。

ご質問の内容が間違っている場合は、残念ながら、それに直接的な解決策はありません。アプリケーションの1つのインスタンスでグリッドに表示されるのは、「btnPopulate_Click」メソッドを呼び出すときにデータベース値が設定された基になるデータを(あなたの場合はDataTableオブジェクトの)IN MEMORY表現で表します。それ以降のデータベースの変更は、基礎となるデータテーブルが再度リフレッシュされるまで、インスタンスに対して透過的ではありません。

+0

ちょっと移動したときに自動的にテーブルを同期させることができます(Visual Studio 2010 Professionalのデフォルトを前提としています)。1.データメニュー>新規データの追加2.データベース3.データセット4. ConfigConnection DB。 5.設定を保存します。 6.使用するオブジェクト(テーブル、関数、プロシージャ)などを選択します。7.設定を保存します。 8.(データソース)の下の[設定]を選択します。Shift + Alt + D 9.ドラッグ&ドロップ設定。 10.これは、通常、保存アイコンをクリックするとデータベースに通知する保存アイコン付きのメニューバーを表示します。私はただそれをしたいが、テーブルではなくデータセットで。 - ジャンゴジャズ – djangojazz

関連する問題