Filtrowanie w bazie danych z ADO.Net

0

Witam,
Mam problem z kodem w C#.
Pisze program, który ma być konfiguratorem sprzętu. Wybieramy zasilanie, zabezpieczenie obwodu i inne parametry(wszystko z comboBox’ów)
Całość odbywa się tak:
Klikamy na wybrany przycisk(w tej chwili są tylko 2, będzie więcej), który uruchamia nam połączenie z bazą danych i wgranie do data set wybrane 4 parametry, po których będziemy filtrowali nasze dalsze zapytanie. Wszystkie kolumny zostały przypisane do odpowiednich comboBox’ów. Następnie idąc od góry wybieramy poszczególne zależności czym ograniczamy (filtrujemy po rzędach) liczbę wyników w bazie.

I teraz meritum problemu:

  1. Jak combobox’ach pogrupować powtarzające się pozycje – żeby się nie powtarzało np. 20 razy „wyłącznik”.
  2. Jak w C# realizuje się filtrowanie, czyli:
    -wybieram z pierwszego combo napięcie 400V, bach z 320 wyników zostaje 150. Dalej podaje jakieś zabezpieczenie, bach zostaje 50 wyników itd.
    Męczy mnie to strasznie, bo potrzebuje napisać aplikację dla klientów, a niestety musi być ona w C# (stety niestety, piszę w C++ i nie mam czasu na nauczenie się nowego języka) a termin goni.

Poniżej załączam przykładowy kod (bajzel straszny, ale składam moje pomysły do kupy) i screen’a formatki.

Pozdrawiam
Piotrek

private void radioBBezposredni_CheckedChanged(object sender, EventArgs e)
        {
            BackgroundImage = Image.FromFile("D:\\Siemens_C1.1.tif");
            pParametry.Visible = true;

            OleDbConnection Polaczenie = new OleDbConnection(conString);
            Polaczenie.Open();
            string Zapytanie = "SELECT Napięcie_zasilania"+
                                       ",Zabezpieczenie_obwodu"+
                                       ",Przekaźnik_przeciążeniowy"+
                                       ",Koordynacja "+
                                       "FROM Dane WHERE Rodzaj_sterowania LIKE 'Rozruch bezpośredni'";

            OleDbCommand Wyszukiwanie = new OleDbCommand(Zapytanie, Polaczenie);
            ///Wyszukiwanie.Parameters.Add("Rozruch", Parametr1);//tu wyskakuje ostrzeżenie
            OleDbDataAdapter Adapter = new OleDbDataAdapter(Wyszukiwanie);
            dataSet1.Clear(); // czy potrzebne jest czyszczenie tabeli?
            DataSet ds = c1_bazaDataSet1;//czy to jest potrzebne?
            Adapter.Fill(c1_bazaDataSet1, "Dane");
            dsView = ds.DefaultViewManager; //nowe, do wywalenia
            dataGrid1.DataSource = c1_bazaDataSet1.Tables["Dane"];

            //Napięcie

            cNapiecie.DataSource = dsView;//nowe
            cNapiecie.DisplayMember = "Dane.Napięcie_zasilania";//nowe
            cNapiecie.ValueMember = "Dane.ID";//nowe
            cNapiecie.DataBindings.Add("Text", dsView, "Dane.Napięcie_zasilania");

user image
Pozdrawiam!!

0
  1. jak się pozbyć powtarzających... Albo zrobić DISTINCTA w zapytaniu, albo na obiekcie DataView wykonać .ToTable z odpowiednio dobranymi kolumnami i distinct = true.
    Co do drugiego to dam ci kod - popatrzysz co i jak.
        private void Form1_Load(object sender, EventArgs e)
        {
            Zbior();
        }

        private void Zbior()
        {
            DataSet ds = new DataSet();
            ds.Tables.Add(Typy());
            ds.Tables.Add(Dane());
            ds.Tables["typy"].ChildRelations.Add("relacja_typ", ds.Tables["Typy"].Columns["id"], ds.Tables["dane"].Columns["IDTyp"]);

            BindingSource cmb = new BindingSource(ds, "Typy");
            comboBox1.DataSource = cmb;
            comboBox1.DisplayMember = "typ";
            comboBox1.ValueMember = "id";

            // To poniżej najważniejsze!!
            // Jeśli parę linijek wyżej dodałem relację (ChildRelation)
            // i do combo przypisałem tabelę, która jest nadrzędna w tej relacji
            // to do datagridview przypisuję tę relację przefiltrowaną wg combo
            BindingSource dgv = new BindingSource(cmb, "relacja_typ");
            dataGridView1.DataSource = dgv;
        }

        private DataTable Typy()
        {
            DataTable dt = new DataTable("typy");
            dt.Columns.Add("typ", typeof(string));
            dt.Columns.Add("id", typeof(int)).AutoIncrement = true;

            dt.Rows.Add(new object[] { "Typ 1" }); // id=0
            dt.Rows.Add(new object[] { "Typ 2" }); // id=1

            return dt;
        }

        private DataTable Dane()
        {
            DataTable dt = new DataTable("dane");
            dt.Columns.Add("napiecie", typeof(int));
            dt.Columns.Add("opis", typeof(string));
            dt.Columns.Add("IDTyp", typeof(int)).AllowDBNull = false;
            dt.Columns.Add("id", typeof(int)).AutoIncrement = true;

            dt.Rows.Add(new object[] { 220, "opis 1", 1 });
            dt.Rows.Add(new object[] { 380, "napiecie 380", 0 });
            dt.Rows.Add(new object[] { 420, "opis 3", 1 });
            dt.Rows.Add(new object[] { 230, "opis 4", 1 });

            return dt;
        }

Na formie 1combobox, 1datagridview bez zmieniania jakichkolwiek propertiesów...

pozdrawiaMM

1 użytkowników online, w tym zalogowanych: 0, gości: 1