Wyświetlanie zawartości BD w TextBox

0

Witam,
Od dłuższego czasu próbuje rozwiązać swój problem ale brak mi już pomysłów.
Opis problemu.
Na Formie mam:
ComboBox, TextBox, Button

Do ComboBoxa ładuję zawartość kolumny z Tabeli Access.
Tabela : Ankieta
Klucz Główny : ID_Ankiety
Kolumna : Nazwa_Ankiety
I to działa w miarę dobrze.

Następnie w TextBoxie mają mi się pojawiać Pytania Ale tylko z wybranym ID_Ankieta.
Tabela : Pytania
Klucz Główny : ID_Pytania
Klucz Obcy : ID_Ankiety
Kolumna : Nazwa_Pytania

Pytania z TextBoxa chciałbym przewijać za pomocą buttona.

Bardzo proszę o naprowadzenie i ewentualną pomoc bo mi brak już pomysłów

0

Używasz Bindings, czy ręcznie ładujesz dane?

0

Jeśli chodzi o wypełnienie danymi ComboBoxa to robię tak Jest on ładowany podczas Ładowania Formy :

 
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Ankieta", myCon);
            DataTable dt = new DataTable();
            da.Fill(dt);

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                cmbWyborAnkiety.Items.Add(dt.Rows[i]["NazwaAnkiety"]);
            }

Następnie w zdarzeniu ComboBox_SelectedIndexChanged

private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Pytania WHERE ID_Ankieta = " + Convert.ToInt32(ComboBox.SelectedIndex + 1), myCon);
            DataTable dataTable = new DataTable("Pytania");
            da.Fill(dataTable);
            DataTableReader dtr = dataTable.CreateDataReader();
            myCon.Close();
            while (dtr.Read())
            {
                txtNazwaPytania.Text = dtr["Nazwa_Pytania"].ToString();
            }
        }

I Wyświetla mi się jedno pytanie O danym ID_Ankieta a chciałbym teraz żebym mógł zobaczyć kolejne Pytania które mają podane ID_Ankieta.

0

while (dtr.Read())
{
txtNazwaPytania.Text = dtr["Nazwa_Pytania"].ToString();
}

Przy kazdym cyklu tej petli zastepujesz cala wartosc pola Text, a powinienes dodac do poprzedniej wartosci:

 while (dtr.Read())
            {
                txtNazwaPytania.Text += dtr["Nazwa_Pytania"].ToString();
            }
0

Ok powiedzmy że pod ID_Ankieta = 1 mam 3 pytania.

ID_Ankiety | Nazwa_Pytania
1 | Twoja Płeć
1 | Wiek
1 | Wykształcenie
2 | xxxxxx

I teraz wyświetli mi się w TextBoxie Tekst "Twoja Płeć"
Następnie chciałbym po kliknięciu na Button żeby przeszło do następnego Pytania i Tak aż do wykształcenia gdyż pytanie xxx ma inne ID_Ankieta.

1
arkagdynia napisał(a)

Jeśli chodzi o wypełnienie danymi ComboBoxa to robię tak Jest on ładowany podczas Ładowania Formy :

 
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Ankieta", myCon);
            DataTable dt = new DataTable();
            da.Fill(dt);

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                cmbWyborAnkiety.Items.Add(dt.Rows[i]["NazwaAnkiety"]);
            }

Następnie w zdarzeniu ComboBox_SelectedIndexChanged

private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Pytania WHERE ID_Ankieta = " + Convert.ToInt32(ComboBox.SelectedIndex + 1), myCon);
            DataTable dataTable = new DataTable("Pytania");
            da.Fill(dataTable);
            DataTableReader dtr = dataTable.CreateDataReader();
            myCon.Close();
            while (dtr.Read())
            {
                txtNazwaPytania.Text = dtr["Nazwa_Pytania"].ToString();
            }
        }

I Wyświetla mi się jedno pytanie O danym ID_Ankieta a chciałbym teraz żebym mógł zobaczyć kolejne Pytania które mają podane ID_Ankieta.

  1. To:** DataTableReader dtr** musisz sobie zadeklarować "wyżej", a w ComboBox_SelectedIndexChanged zostawić tylko dtr = dataTable.CreateDataReader();

  2. Zamiast

            while (dtr.Read())
            {
                txtNazwaPytania.Text = dtr["Nazwa_Pytania"].ToString();
            } 

daj sobie

            if (dtr.Read())
            {
                txtNazwaPytania.Text = dtr["Nazwa_Pytania"].ToString();
            } 
  1. W obsłudze buttona też daj :
            if (dtr.Read())
            {
                txtNazwaPytania.Text = dtr["Nazwa_Pytania"].ToString();
            } 

Ewentualnie po tym ifie daj elsa z tekstem "koniec pytań" jak już nie będzie nic do odczytu.

0

Ok wielkie dzięki za pomoc działa :)

0

Ok teraz napotkałem na poważny problem który myślałem że łatwo się rozwiąże. Zrobiłem wszystko tak jak w poście wyżej. I teraz problem polega na tym jak wyświetlać w Radiobuttonach odpowiedzi do danego pytania.
Tabele potrzebne do tego:

Tabela Pytania składa się z kolumn:

ID_Pytania | ID_Ankiety | Nazwa_Pytania
1 | 1 | Wiek
2 | 1 | Płeć
3 | 1 | Wykształcenie

Tabela Odpowiedz składa się z kolumn:

ID_Odpowiedzi | ID_Pytania | Odpowiedz
1 | 1 | <18
2 | 1 | więcej niż 19 mniej niż 50
3 | 1 | > 51
4 | 2 | Kobieta
5 | 2 | Mężczyzna

Maksymalnie może być 6 odpowiedzi do danego pytania
Minimalnie mogą być 2 odpowiedzi do danego pytania.

I tak jak w TexBoxie wyświetla się Płeć to ładują się dwa Radiobuttony :

  • kobieta
  • mężczyzna

To samo z wiekiem. Na formie mama 6 Radiobuttonów i rozumiem ze będzie trzeba je ukrywać itd.
Ma ktoś jakieś propozycje jak to rozwiązać bardzo proszę o pomoc

0
arkagdynia napisał(a)

Ok teraz napotkałem na poważny problem który myślałem że łatwo się rozwiąże. Zrobiłem wszystko tak jak w poście wyżej. I teraz problem polega na tym jak wyświetlać w Radiobuttonach odpowiedzi do danego pytania.
Tabele potrzebne do tego:

Tabela Pytania składa się z kolumn:

||ID_Pytania||ID_Ankiety||Nazwa_Pytania
||1||1||Wiek
||2||1||Płeć
||3||1||Wykształcenie

Tabela Odpowiedz składa się z kolumn:

||ID_Odpowiedzi||ID_Pytania||Odpowiedz
||1||1||<18
||2||1||więcej niż 19 mniej niż 50
||3||1||> 51
||4||2||Kobieta
||5||2||Mężczyzna

Maksymalnie może być 6 odpowiedzi do danego pytania
Minimalnie mogą być 2 odpowiedzi do danego pytania.

I tak jak w TexBoxie wyświetla się Płeć to ładują się dwa Radiobuttony :

  • kobieta
  • mężczyzna

To samo z wiekiem. Na formie mama 6 Radiobuttonów i rozumiem ze będzie trzeba je ukrywać itd.
Ma ktoś jakieś propozycje jak to rozwiązać bardzo proszę o pomoc

OK. Ale tylko Cie naprowadzę.
W obsłudze buttona, który Ci zmienia pytania wyciągasz nazwę pytania, ale równie dobrze przy okazji możesz sobie pobrać ID_pytania.
Teraz tylko robisz proste zapytanie do tabeli z odpowiedziami (id_pytania masz)
Deklarujesz sobie nowy datatablereader i do niego zwracasz wynik. Ile ci zwróci rekordów, tyle masz radiobuttonów.
Dalej kombinujesz sam :)

Radziłabym Ci to wsadzić w jakąś funkcje, bo przy pierwszym pytaniu w ankiecie, tym ustawianym w ComboBox_SelectedIndexChanged, musisz zrobić to samo.

0

Ok dzięki za nakierowanie zrobiłem tak jak naprowadziłaś kodzik:

 
// Odpowiada za wybór Odpowiedzi.
            da2.SelectCommand = new OleDbCommand("SELECT ID_Odpowiedzi, Odpowiedz FROM Odpowiedzi WHERE ID_Pytania = " + dtr["ID_Pytania"].ToString(), myCon);
            DataTable dataTable2 = new DataTable("Odpowiedzi");
            da2.Fill(dataTable2);
            dtr2 = dataTable2.CreateDataReader();
            myCon.Close();
            if (dtr2.Read())
            {
               
            }

I jak z tymi Radiobuttonami bo to jest teraz największy problem. Dziękuję Ci bardzo za pomoc gdyby nie Ty to kurcze nie dał bym rady.:(

0

Niestety mój dtr2 nie ma takich właściwości jedynie:

  • HasRows
  • RecordsAffected

Pomoże ktoś mi z tym problemem bardzo proszę :(

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