さまざまな形式とフィールドのファイルのデータ処理タスクを自動化しようとしています。区切られたファイルの区切り文字を決定し、ファイルの塊をフォーム上の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
}
}
です。さらに情報が必要な場合は、私に知らせてください。どんなアイデアや解決策も大変ありがとうございます。
ありがとうございます!
+1完全な質問ですが、どのような動作が得られているのか、何が動作していないのかを詳しく説明すると役に立ちます。 SelectedIndexChangedイベントが発生していますか?もしそうなら、それを使って他のコンボボックスを "メッセージ"して、選択した要素をリストから削除することができます... –
SelectedIndexChangedが発砲しているので、私が選択したフィールドを伝えるメッセージボックスのポップアップが表示されます。しかし、コンボボックスで選択したフィールドが消え、次のコード行でBindingSourceから値を取り除くと、別のメッセージボックスが空白の値でポップアップします。だからそれがある。その後、別の列をクリックすると、SelectedIndexを処理する実行時エラーが発生します。私は、各コンボボックスごとに異なるバインディングソースを作成するという提案を使用して始め、その点からどのようなトラブルが発生するのかを見ていきます。再度、感謝します! – Caddy