2017-11-01 7 views
-1

私は、例えば3列のデータベースを持っています。複数の生成されたコントロールの値を取得

ID(int)、名前(Varchar)、日付(Datetime)。

私のアプリケーションを介してこのデータベースに行を追加したいと思います。異なるデータ型に対して異なるコントロールを使用したいとします。 IDの場合、上向き/下向き矢印のあるテキストボックスが必要です。 nameの場合は単純なTextBox、Dateの場合はDatePickerです。

これは簡単です。自分のデータベースからSchemaTableをループに呼び出し、if文でDataType = System.String or System.DateTime or System.Int32をチェックします。

それだけです。

Enterを押したときの操作は?コントロールは動的に追加され、すべてのプロパティが異なります。しかし、私はこれをDataBaseに保存するために、すべての値を必要とします。

私の考えは、コントロールContent Propertyをループし、値を取得します。 しかし、多くのコントロールには異なるコンテンツプロパティがあります。 たとえば、DatePickerにはBox + Pickアイコンがあります。

どのようにあなたたちはこれを解決するつもりですか?

すべての場合には、私はこのコードでそれらのすべてからのTextプロパティを取得することができます(彼らは今のところです)のTextBoxた:

List<TextBox> textboxes = new List<TextBox>(); 
textboxes = sp.Children.OfType<TextBox>().ToList(); 
string query = "INSERT INTO " + myTable + " ("; 

for (int i = 0; i < textboxes.Count; i++) 
{ 
    if (i < textboxes.Count - 1) 
     query += textboxes[i].Name + ","; 
    else 
     query += textboxes[i].Name; 
} 

query += ") VALUES ("; 

for (int i = 0; i < textboxes.Count; i++) 
{ 
    if (textboxes[i] == null) 
    { 
     textboxes[i].Text = "0"; 
    } 

    if (i < textboxes.Count - 1) 
     query += "'" + textboxes[i].Text + "',"; 
    else 
     query += "'" + textboxes[i].Text + "')"; 
} 

が、これは異なるため、コントロールの、今働くことができないことができます毎回変更されるので決して静的ではなく、コントロールを生成する必要があります。

これは、私はそれが明確ではありません

foreach (DataRow field in schemaTable.Rows) 
     { 
      if (field.Field<String>("ColumnName") != "id") 
      { 
       if (field["DataType"].ToString() == "System.DateTime") 
       { 
        DatePicker datePicker = new DatePicker(); 
        MaterialDesignThemes.Wpf.HintAssist.SetHint(datePicker, 
         UppercaseFirst(field.Field<String>("ColumnName"))); 
        MaterialDesignThemes.Wpf.HintAssist.SetIsFloating(datePicker, true); 
        datePicker.Margin = new Thickness(5); 
        datePicker.Name = field.Field<string>("ColumnName"); 
        datePicker.Tag = field.Field<Boolean>("AllowDBNull"); 
        sp.Children.Add(datePicker); 
       } 
       else 
       { 
        TextBox textBox = new TextBox(); 
        MaterialDesignThemes.Wpf.HintAssist.SetHint(textBox, UppercaseFirst(field.Field<String>("ColumnName"))); 
        MaterialDesignThemes.Wpf.HintAssist.SetIsFloating(textBox, true); 
        textBox.Margin = new Thickness(5); 

        textBox.Name = field.Field<String>("ColumnName"); 
        textBox.Tag = field.Field<Boolean>("AllowDBNull"); 

        sp.Children.Add(textBox); 
       } 


      } 
     } 
+1

MVVMパターンはすでに使用していましたか? *あなたがWPFで何をしたいのですか?WPF関連の質問のための良い答えのほとんどは、MVVMに基づいています。あなたがまだそれを知らない/使用していない場合は、それ。 – grek40

+0

私はいつもmvvmを学ぶことに失敗しました。彼はそれについていくつかのチュートリアルを作成するので、mvvmパターンで動作する男を待っている。だから私はコードビハインドで働いていません。そして、私はmvvmでこれがどのように動作するのかわかりません。なぜなら、mvvmではプロパティをコード化する必要があるかどうかです。私のデータベースや2または10に1列を持つことができるので、私は同じプロパティを持っていません。これは "私はこれと永遠にこれを持っている"のようなものではありません。だから私は静的なプロパティを作ることができません(静的な意味では、静的なプロパティではなくハードコードされているという意味です)。 – Luranis

+0

MVVMは魔法のように仕事をしません。 SchemaTableのクエリをアプリケーションのデータモデルに変換し、データモデルを挿入ステートメントに変換し、データモデルを個別に表示することができます。これは、パズルを段階的に解決するためのステップですデータベースからユーザーインターフェイスに複雑さの単一の巨大な一括で。 – grek40

答えて

1

(のみあなたのより良い理解のための日付ピッカーと、通常のテキストボックスを表示)コントロールを追加する方法のコードです。 3列ありIDが増分の場合は、次のコードを使用してください。

foreach (var row in textboxes) 
{ 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 

     string saveQuery = "INSERT into " + myTable+ " (name, date) VALUES (@name, @date)"; 
     using (SqlCommand querySave = new SqlCommand(saveQuery)) 
     { 
      querySave.Connection = connection; 

      querySave.Parameters.Add("@name", SqlDbType.VarChar, 255).Value = (row == null) ? 0 : row.Text; 
      querySave.Parameters.Add("@date", SqlDbType.DateTime).Value = DateTime.Now; 

      connection .Open(); 
      querySave.ExecuteNonQuery(); 
      connection .Close(); 

     } 
    } 
} 
+1

OPに値をコマンドに組み込むのではなく、 'SqlParameter'を使うべきだと私は間違いなく同意しますが、この答えは質問に記載されているものがたくさんあると思います( – grek40

+0

シナリオをより明確に説明してください... たとえば、動的要素を持つことができる「Windowsフォームアプリケーション」を作成しましたか?そのデータを保存する必要がありますか? –

+0

あなたは 'foreach(テキストボックス内のvar行)'を持っています。私はテキストボックスしか持っていません。私はDatePickerなどがあり、それらのすべてから価値が必要です。 – Luranis

関連する問題