Перезагрузить DataGridview при изменении выбора элемента ComboBox - PullRequest
0 голосов
/ 19 ноября 2018

Я создал форму, у которой есть DataGrid, и она загружается из файла Excel. Я хочу показать имя листа файла Excel в поле со списком. Я нашел свое решение, чтобы показать имя листа Excel в поле со списком. Но я хочу, чтобы, когда я изменил свой элемент со списком, заполненное представление данных зависело от листа Excel, который я изменял в своем поле со списком. [IMG] http://i67.tinypic.com/153l82v.jpg[/IMG] Как я могу это сделать? Мой код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;
namespace excel2access
{
    public partial class Form2 : Form
    {
        string FilePath;
        string CB;

        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog OpenFD = new OpenFileDialog();
            OpenFD.FileName = "";
            OpenFD.Title = "Choose Excel file to Upload Data ";
            OpenFD.DefaultExt = "xls";
            OpenFD.Filter = "Ms-Excel Files (*.xls)|*.xls|All Files|*.*";

            if (OpenFD.ShowDialog() == DialogResult.OK)
            {
                FilePath = OpenFD.InitialDirectory + OpenFD.FileName;//Code to get FullPath, Filename and extension
                textBox1.Text = FilePath;
                string excelConnStr = string.Empty;
                OleDbCommand excelCommand = new OleDbCommand();
                if (FilePath.EndsWith(".xlsx"))
                {
                    //2007 Format
                    excelConnStr =string.Format("Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0};Extended Properties='Excel 8.0;HDR=No'", FilePath);
                }
                else
                {
                    //2003 Format
                   excelConnStr= string.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties='Excel 8.0;HDR=No'", FilePath);
                }
                //Get the Sheets in Excel Workbook                
                OleDbConnection excelConn = new OleDbConnection(excelConnStr);
                OleDbCommand cmdExcel = new OleDbCommand();
                OleDbDataAdapter oda = new OleDbDataAdapter();
                cmdExcel.Connection = excelConn;
                excelConn.Open();
                comboBox1.DataSource = excelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                comboBox1.DisplayMember = "TABLE_NAME";
                comboBox1.ValueMember = "TABLE_NAME";
                CB = comboBox1.DisplayMember;
                DataTable dtsheet = new DataTable();
                dtsheet = excelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);                
                OleDbDataAdapter da = new OleDbDataAdapter("select * from [" + comboBox1.Text + "]", excelConnStr);
                DataTable dt = new DataTable();
                da.Fill(dt);
                dataGridView1.DataSource = dt;
            }
        }

    }
}

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Вы должны определить событие SelectionIndexChanged для comboBox1 и перепривязать сетку из этого события.

Я должен предложить, например, когда вы загружаете сетку в первый раз, тогда хранилище данных нескольких листов в одном наборе данных с несколькими таблицами.

Когда пользователь меняет раскрывающееся значение, затем получает данные из этого набора данных, поэтому вы предотвращаете многократное попадание в базу данных.

0 голосов
/ 19 ноября 2018

попробуйте

 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            button1.PerformClick();
        }
0 голосов
/ 19 ноября 2018

Вы должны определить событие SelectionChanged для comboBox1 и заново привязать сетку из этого события.код будет выглядеть примерно так:

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
     string excelConnStr = string.Empty;
     OleDbCommand excelCommand = new OleDbCommand();
     if (FilePath.EndsWith(".xlsx"))
     {
         excelConnStr =string.Format("Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0};Extended Properties='Excel 8.0;HDR=No'", FilePath);
     }
     else
     {
         excelConnStr= string.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties='Excel 8.0;HDR=No'", FilePath);
     }
     string selectedSheet= (sender as ComboBox).SelectedItem as string;
     OleDbConnection excelConn = new OleDbConnection(excelConnStr);
     OleDbCommand cmdExcel = new OleDbCommand();
     OleDbDataAdapter oda = new OleDbDataAdapter();
     cmdExcel.Connection = excelConn;
     excelConn.Open();
     DataTable dtsheet = new DataTable();
     dtsheet = excelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);                
     OleDbDataAdapter da = new OleDbDataAdapter("select * from [" + selectedSheet + "]", excelConnStr);
     DataTable dt = new DataTable();
     da.Fill(dt);
     dataGridView1.DataSource = dt;
}

В приведенном выше коде (sender as ComboBox).SelectedItem as string; поможет вам получить выбранный элемент из выпадающего списка с измененным выбором события

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...