2012-04-25 11 views
3

さまざまな形式とフィールドのファイルのデータ処理タスクを自動化しようとしています。区切られたファイルの区切り文字を決定し、ファイルの塊をフォーム上のDataGridViewにロードするプログラムを作成しました。これにより、ファイルがSQLテーブルにバルクロードされる前にファイルのいくつかのフィールドを確認できるようになります。テーブルは、ユーザーがデータグリッドのコンボボックスで選択したいくつかのフィールド名を使用してオンザフライで作成されます。DatagridViewのComboBoxの値の追加/削除/選択

これは私の目標ですが、問題に正しく近づいているかどうかはわかりません。

は、この時点で、私はここで

BindingSource bindingSource = new BindingSource(); 

は、私は、データファイル内の各フィールドの列を追加し、選択したファイルのDataGridViewのを示して...コンボボックス用のBindingSourceを作成しました

private void ShowDataGridView(string file, string delimiter, string[] fieldNames, string[] fieldLengths) 
    { 
     StreamReader fileReader = new StreamReader(file); 
     if (bindingSource.Count == 0) 
     { 
      bindingSource.Add("FIRSTNAME"); 
      bindingSource.Add("LASTNAME"); 
      bindingSource.Add("ADDRESS1"); 
      bindingSource.Add("ADDRESS2"); 
      bindingSource.Add("CITY"); 
      bindingSource.Add("STATE"); 
      bindingSource.Add("ZIP"); 
      bindingSource.Add("COMPANY"); 
      bindingSource.Add("EMAIL"); 
      bindingSource.Add(""); 
     }   
     dataGridView1.Rows.Clear(); 
     dataGridView1.Columns.Clear(); 
     int count = 0; 
     for (int i = 0; i < 17; i++) //read 17 lines into datagridview for field confirmation, 17 lines just so happens to fill my datagridview nicely, last row will be combobox for field name selection 
     { 
      string[] fields = StringFunctions.Split(fileReader.ReadLine(), delimiter, Convert.ToString("\"")); 
      count = fields.Count(); 
      if (i == 0) 
      { 
       // Adding Column Header to DataGridView 
       for (int x = 0; x < count; x++) 
       { 
        DataGridViewTextBoxColumn columnDataGridTextBox = new DataGridViewTextBoxColumn(); 
        columnDataGridTextBox.Name = fieldNames[x]; 
        columnDataGridTextBox.HeaderText = fieldNames[x]; 
        dataGridView1.Columns.Add(columnDataGridTextBox); 
       } 
      } 
      dataGridView1.Rows.Add(fields); 
     } 

     for (int x = 0; x < count; x++) 
     { 
      DataGridViewComboBoxCell combobox = new DataGridViewComboBoxCell();    
      combobox.DataSource = bindingSource; 
      dataGridView1[x, 16] = combobox; //remember 17 rows added, combobox will be last row in datagridview 
      combobox = null; 
     } 
     dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; 

     fileReader.Close(); 
     fileReader = null; 
    } 

これでデータのすべてのフィールドについてデータとコンボボックスが表示されました。特定のフィールドは必須です(BindingSourceフィールド名)。ユーザーがコンボボックスからデータの列に適切なフィールド名を選択できるようにします。ユーザーがコンボボックスからフィールドを選択したときに、そのフィールド名をBindingSourceから削除したいので、別の列に同じフィールド名を選択することはできません。残りのフィールドは、私が問題:)

私はコードスニペット検索したを抱えているところなど(姓、フィールド2、氏名、住所1、フィールド5、Field6、アドレス2など)

コンボボックスがあり、デフォルトのフィールド名を持つことになります私はいくつかの進歩を遂げていますが、私はdatagridviewイベントをよりよく把握している人からアドバイスを受けることができます。私は自分が何をやっているのか本当に分かっていない。ちょうどそれが固執するかどうかを知るために壁に物を投げ込むだけだ。以下は私が十分に記述されていると考えられるあらゆるコードの第一人者が、私が達成しようとしている何の感触をヘルパー与えるために十分なコードを掲載しました願っています...私がこれまで試したものを

InitializeComponent(); 
dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(DataGridViewEditingControlShowing); 

private void DataGridViewEditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     //here we will add the combo box's selected event changed 
     ComboBox cmbBox; 
     if (dataGridView1.CurrentCell is DataGridViewComboBoxCell) 
     { 
      cmbBox = e.Control as ComboBox; 
      if (cmbBox == null) 
       return; 
      cmbBox.SelectedIndexChanged += cmbBox_SelectedIndexChanged; 
     } 
    } 

    //This will display value of Select values of Combo Box 
    //which is DataGridView 
    void cmbBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ComboBox cmbBox = (ComboBox)sender; 
     if (cmbBox.SelectedValue != null) 
     { 
      MessageBox.Show(cmbBox.SelectedValue.ToString()); //testing 
      bindingSource.Remove(cmbBox.SelectedValue); //this removes it from the current combobox as well, no good. Also run time error when clicking into a different combobox 
     }   
    } 

です。さらに情報が必要な場合は、私に知らせてください。どんなアイデアや解決策も大変ありがとうございます。

ありがとうございます!

+0

+1完全な質問ですが、どのような動作が得られているのか、何が動作していないのかを詳しく説明すると役に立ちます。 SelectedIndexChangedイベントが発生していますか?もしそうなら、それを使って他のコンボボックスを "メッセージ"して、選択した要素をリストから削除することができます... –

+0

SelectedIndexChangedが発砲しているので、私が選択したフィールドを伝えるメッセージボックスのポップアップが表示されます。しかし、コンボボックスで選択したフィールドが消え、次のコード行でBindingSourceから値を取り除くと、別のメッセージボックスが空白の値でポップアップします。だからそれがある。その後、別の列をクリックすると、SelectedIndexを処理する実行時エラーが発生します。私は、各コンボボックスごとに異なるバインディングソースを作成するという提案を使用して始め、その点からどのようなトラブルが発生するのかを見ていきます。再度、感謝します! – Caddy

答えて

1

あなたは正しい軌道に乗っていますが、これが機能するためには、それぞれのコンボボックスには独自のデータソースが必要なので、個別に操作することができます。彼らがすべて同じソースを共有している場合、異なる内容を持つことはできません。コンボボックスAからXを選択すると、他のコンボボックスから除外されます。

コンボボックスを作成するループでは、それぞれが独自のデータソースを持つようにデータソースをクローンします。

+0

Daveさん、ありがとう、それは良いアイデアのように思えます。私はそれに取り組むだけでなく、何が失敗しているかについて私の質問に多くの説明を追加します。このような迅速な対応をお寄せいただきありがとうございます。まだ投票することを許可していないノブでなければ、私はあなたに投票します:) – Caddy

+0

ヘイデイブ、もしあなたがまだ周りにいるなら、データソースをクローンするのですか?私はこれを解決することができませんでした、そして、私はこの時点で立ち往生しています。 – Caddy

+0

列を作成するために使用するループ内に複数のデータソースを作成します。後でそれらを扱うことができるように、それらを一般的な 'Dictionary 'コレクションに追加することができます。ループカウンターをキーとして使用します。 –

関連する問題