3

さまざまな形式やフィールドのファイルのデータ処理タスクを自動化しようとしています。区切りファイルの区切り文字を決定し、ファイルのチャンクをフォームの DataGridView にロードするプログラムを作成しました。これにより、ファイルが SQL テーブルに一括ロードされる前に、ユーザーがファイルのいくつかのフィールドを確認できるようになります。 . テーブルは、ユーザーがデータグリッドのコンボボックスで選択したフィールド名の一部を使用して、その場で作成されます。

それが私の目標ですが、問題に正しく取り組んでいるかどうかはわかりません。

この時点で、コンボボックスの BindingSource を作成しました ...

BindingSource bindingSource = new BindingSource();

ここでは、データ ファイルの各フィールドに列を追加して、選択したファイルの DataGridView を表示します。

    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 から削除したいので、ユーザーは別の列に同じフィールド名を選択できません。残りのフィールドには、デフォルトのフィールド名があります (FirstName、Field2、LastName、Address1、Field5、Field6、Address2 など)。

コンボボックスは私が問題を抱えている場所です:)

コード スニペットを検索し、ある程度の進歩を遂げていますが、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
        }          
    }

私が達成しようとしていることについて、可能な限りのコード グル ヘルパーに感じてもらうために、十分に説明し、十分なコードを投稿したことを願っています。さらに情報が必要な場合は、お知らせください。どんなアイデア/解決策も大歓迎です。

ありがとう!

4

1 に答える 1

1

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

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

于 2012-04-25T16:25:25.837 に答える