2017-10-11 11 views
1

私は、DataGridViewをデータベースのデータでバインドしています。フォームを作成する必要があります。フォームには、単一のグリッド行からのデータの入力フィールドがあります。 フォームには30個以上の入力コントロール(テキストボックス、チェックボックス、NumericUpDown)があります。フォームにインスタンスを渡し、手動入力を埋めるC#DataGridViewと入力フォーム

  1. 細胞からクラスインスタンス

  2. へのDataGridViewと負荷値から現在の行を取得:

    は、今のところ私はこのアプローチを用いて行きました

  3. 更新フォームからデータベースは、DataGridViewのを更新制御する

私はいくつかのことを改善したい:

  1. はすぐにクラスのインスタンスからすべての入力コントロールを埋めるための方法はありますか?
  2. イベントハンドラのすべてのコントロールを手動でサブスクライブするだけでなく、入力コントロールの値が変更されたかどうかを判断する方法はありますか?
  3. この全体を改善する方法はありますか?より効率的に何かをする?
+0

'DataGridView'からデータベースを更新することを検討してください。 (例:[1](https://stackoverflow.com/q/27760744/3773066)、[2](https://stackoverflow.com/q/8653523/3773066))後者からは、[DataAdapter ](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/updating-data-sources-with-dataadapters)を参照してください。 – OhBeWise

答えて

2

既にDataRowを渡している場合は、DataTableとそのテーブルの行を識別するものを渡すことができます。フォームの終了時にすぐに変更をコミットする場合は、アダプタ(オプション)を使用します。次に、そのテーブルのDataViewを作成することができます。そして、各編集コントロールをそのビューのフィールドにバインドします。このような何か:

public partial class EditForm : Form 
{ 

    DataRow row = null; 
    DataView view; 
    SqlDataAdapter adapter; 

    public EditForm(SqlDataAdapter adapter, DataTable table, int rowId) 
    { 
     InitializeComponent(); 

     this.adapter = adapter; 

     view = table.DefaultView; 
     view.RowFilter = $"ID = {rowId}"; 
     if (view.Count == 0) throw new Exception("no such row"); 
     DataRowView dvr = view[0]; 
     row = dvr.Row; 

     datebox.DataBindings.Add(new Binding("Value", view, "DATE")); 
     stringbox.DataBindings.Add(new Binding("Text", view, "O_STRING")); 

     this.FormClosing += EditForm_FormClosing; 
    } 

    private void EditForm_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (row.RowState == DataRowState.Modified) adapter.Update(new DataRow[] { row }); 
    } 
} 

ザ・あなたのテーブルがIDとフィールドDATEO_STRINGという名前のキー列を持っていると仮定して上記。

これにより、その行に基づいて中間カスタムクラスインスタンスを作成し、さまざまなオブジェクト間で値を移動し、元のテーブルに自動的にRowStataeを設定する手間が省けます。

+0

anwserのおかげで、DataViewのように私が必要なものです。しかし、それが値を変更したことを入力コントロールが認識するような方法はありますか?例えば。ユーザーがテキストを変更した場合、TextBoxでフォントを太字にしますか? – Technical

0

Re:値が変更されました。それを行うには本当にエレガントな方法があるかどうかは分かりません。まず、私がする必要があった場合は、フォントの太字ではなく背景(または前景)の色を変更します。フォントを太字に設定すると、コンテンツの幅が変更され、通常は迷惑になります。次に、TextChangedイベント(またはテキストベースでないコントロールの場合はValueChangeイベント)にハンドラを追加します。イベントハンドラでは、コントロールオブジェクトを指すobject senderパラメータを取得します。ないあなたが持っているすべての編集ボックスに1つずつ

private void stringbox_TextChanged(object sender, EventArgs e) 
{ 
    Control ctrl = (Control)sender; 
    string fieldName = ctrl.DataBindings[0].BindingMemberInfo.BindingMember; 
    if ((string)view[0].Row[fieldName] != ctrl.Text) ctrl.BackColor = Color.Pink; 
} 

だけ(編集contolクラスごとに)一回TextChangedハンドラを追加する必要がありますその方法、:そして、あなたはこのようなもので、そのコントロールにバインドさフィールド名を取得することができます。

関連する問題