Объединить два запроса в одном представлении данных - PullRequest
0 голосов
/ 28 августа 2018

Мое приложение подключается к файлам Excel через openfiledialog. У меня есть два поиска, основной поиск и дополнительный. Я хотел бы получить их результат в одном datagridview. Мой код (основной поиск):

private void searchbtn_Click(object sender, EventArgs e)
{
    try
    {
        string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";
        OleDbConnection conn = new OleDbConnection(connStr);
        OleDbDataAdapter da = new OleDbDataAdapter("Select * from [" + testcb.SelectedItem.ToString() + "$] where [" + comboBox1.SelectedItem.ToString() + "] = '" + textBox5.Text + "'", conn);
        DataTable dt = new DataTable();
        da.Fill(dt);
        dataGridView2.DataSource = dt;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

И вторичный поиск:

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";
        OleDbConnection conn = new OleDbConnection(connStr);
        OleDbDataAdapter da = new OleDbDataAdapter("Select * from [" + testcb.SelectedItem.ToString() + "$] where [" + addcb.SelectedItem.ToString() + "] = '" + addtb.Text + "'", conn);
        DataTable ds = new DataTable();
        da.Fill(ds);
        dataGridView2.DataSource = ds;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

При вторичном поиске вместо:

dataGridView2.DataSource = ds;

Попробуйте:

DataTable combinedData = (DataTable)(dataGridView2.DataSource);
combinedData.Merge(ds);
dataGridView2.DataSource = combinedData;

Возможно, вам также придется позаботиться о том, чтобы избежать дубликатов в вашем новом источнике данных. Также: я не тестировал это решение, это просто идея.

Надеюсь, это поможет

0 голосов
/ 28 августа 2018

Вам нужно использовать merge. Для этого есть учебник здесь

0 голосов
/ 28 августа 2018

Вы можете иметь 2 DataTables, скажем, dt1, dt2 и объединенный dtAll. Затем вы можете объединить 2 и установить его в DataSource

private UpdateDataSource()
{
    dataGridView2.Rows.Clear();
    dataGridView2.Refresh();
    dtAll.Clear();

    if(dt1 == null && dt2 != null)
    {
        dtAll = dt2;
    }
    else if(dt2 == null && dt1 != null)
    {
        dtAll = dt1;
    }
    else if(dt1 != null && dt2 != null)
    {
        dtAll = dt1.Copy();
        dtAll.Merge(dt2);
    }
    else
    {
        dtAll = null;
    }
    dataGridView2.DataSource = dtAll;
}

Ваши обработчики событий должны выглядеть примерно так:

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";
        OleDbConnection conn = new OleDbConnection(connStr);
        OleDbDataAdapter da = new OleDbDataAdapter("Select * from [" + testcb.SelectedItem.ToString() + "$] where [" + addcb.SelectedItem.ToString() + "] = '" + addtb.Text + "'", conn);
        dt2.Clear();
        da.Fill(dt2);
        UpdateDataSource();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
...