Problem z DataGridView i odświeżaniem nowo dodanych danych

0

Witam!
Piszę bazodanową aplikacje do obsługi biblioteki w Windows Forms i ADO.NET.

Mam stworzonych kilka formularzy.
Wyświetlam zawartość rekordów z bazy danych na 1 formie korzystając z kontrolki datagridview a dodaje dane z innej formy.

I mam problem bo po poprawnym dodanie rekordu datagrid nie odświeża mi się a nowo dodany rekord pojawia się dopiero po ponownym skompilowaniu aplikacji.

Chciałbym aby po dodaniu rekordu mój formularz dodawania zamknoł się (bądz schowal) a pozniej automatycznie odświeżył mi się data grid.

Próbowałem juz korzystac z dg.Refresh() ale to nic nie daje.

Bardzo proszę o pomoc.

Tutaj mam wyswietlanie:

cs = new SqlConnection(connectionString);
            cs.Open();

            cmd = new SqlCommand("SELECT ID_ksiazka, Tytul, Autor, Data_wydania, Wydawnictwo, ISBN, Ilosc_stron, Ilosc_sztuk, Cena, Opis FROM Ksiazka", cs);
            try
            {
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        dgWszystkieKsiazki.Rows.Add(dr[0], dr[1], dr[2], dr[3], dr[4], dr[5], dr[6], dr[7], dr[8], dr[9]);
                        dgWszystkieKsiazki.Columns[0].Width = 80;
                        dgWszystkieKsiazki.Columns[1].Width = 120;
                        dgWszystkieKsiazki.Columns[2].Width = 120;
                        dgWszystkieKsiazki.Columns[3].Width = 120;
                        dgWszystkieKsiazki.Columns[4].Width = 120;
                        dgWszystkieKsiazki.Columns[5].Width = 120;
                        dgWszystkieKsiazki.Columns[6].Width = 120;
                        dgWszystkieKsiazki.Columns[7].Width = 120;
                        dgWszystkieKsiazki.Columns[8].Width = 120;
                        dgWszystkieKsiazki.Columns[9].Width = 290;
                    }
                }
                dgWszystkieKsiazki.Refresh();
               
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

 

A tutaj dodaje rekordy:

 
frmGlownaForma o;
        private void btnDodajDoBazy_Click(object sender, EventArgs e)
        {
            o = new frmGlownaForma();
            
            try
            {
                
                cmd = new SqlCommand("INSERT INTO Ksiazka(Tytul,Autor,Data_wydania,Wydawnictwo,ISBN, Ilosc_stron, Ilosc_sztuk, Cena, Opis) VALUES(@tytul,@autor,@data_wydania,@wydawnictwo,@isbn, @ilosc_stron, @ilosc_sztuk, @cena, @opis)", cs);
                cmd.Parameters.AddWithValue("tytul", txtTytul.Text);
                cmd.Parameters.AddWithValue("autor", txtAutor.Text);
                cmd.Parameters.AddWithValue("data_wydania", txtDataWydania.Text);
                cmd.Parameters.AddWithValue("wydawnictwo", txtWydawnictwo.Text);
                cmd.Parameters.AddWithValue("isbn", txtISBN.Text);
                cmd.Parameters.AddWithValue("ilosc_stron", txtIloscStron.Text);
                cmd.Parameters.AddWithValue("ilosc_sztuk", txtIloscSztuk.Text);
                cmd.Parameters.AddWithValue("cena", txtCena.Text);
                cmd.Parameters.AddWithValue("opis", txtOpis.Text);
                cmd.ExecuteNonQuery();

                cmd = new SqlCommand("SELECT ID_ksiazka, Tytul, Autor, Data_wydania, Wydawnictwo, ISBN, Ilosc_stron, Ilosc_sztuk, Cena, Opis FROM Ksiazka", cs);

                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        o.dgWszystkieKsiazki.Rows.Add(dr[0], dr[1], dr[2], dr[3], dr[4], dr[5], dr[6], dr[7], dr[8], dr[9]);
                    }
                }
                this.Hide();
                o.dgWszystkieKsiazki.Refresh();
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
0

Witam ja to bym zrobił mniej więcej w ten sposób. Dodajesz nowy rekord a do grida pobierasz na nowo z bazy zaraz po dodaniu.

             DataSet nazwa = new DataSet(); 
             SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString); 
             SqlDataAdapter myCommand; 
             string select = "SELECT * FROM Table1"; 
             myCommand = new SqlDataAdapter(select, myConnection); 
             myCommand.SelectCommand.CommandType = CommandType.Text; 
             myConnection.Open(); 
             myCommand.Fill(nazwa); 
             GridView1.DataSource = nazwa; 
             GridView1.DataBind();
0

Ok właśnie to implementuje :)

Ale czym jest ta nazwa?

myCommand.Fill(nazwa); 
                 GridView1.DataSource = nazwa; 
                 GridView1.DataBind();
 

Rozumiem ,że nazwa to nazwa dataseta?
A w Windows Forms nie istnieje metoda DataBind() tylko DataBindings() o ile sie nie myle

0

Jesli masz formularz na jakiejs innej formatce możesz go zamknąć w nastepujacy sposob:

form1 =new  form1();

if(form1.ShowDialog()==DialogResult.OK)
{
     //twoj kod
}

co do grida sprobuj

gridView.EndEdit();
0

Ok dzięki już wpadłem na rozwiązanie :)

Wystarczyło ponownie wywołać event frmMian_Load() na koncu, po dodaniu nowych danych.

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