Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Guida VB.NET dalle Relazioni agli Oggetti. - Cap. 74 & 75 - Un aiutino?
Forum - C# / VB.NET - Guida VB.NET dalle Relazioni agli Oggetti. - Cap. 74 & 75 - Un aiutino?

Avatar
xplosiv (Normal User)
Newbie


Messaggi: 5
Iscritto: 20/09/2014

Segnala al moderatore
Postato alle 12:42
Sabato, 20/09/2014
Salve a tutti, e spero di riuscire a trovare un collega che mi aiuti a capire dove sbaglio, magari postando il sorgente completo (funzionante) oppure se molto gentile, e paziente, allegandomi un bell'allegato zip con il progetto completo. In definitiva, seguendo la guida di Totem, sulle Relazioni e passare di conseguenza all'utilizzo dei DataSet e dei DataTable con l'Adapter che mi permette di gestire tutti i records, non sono riuscito ad eseguire la gestione dell'evento per l'aggiunta di un Autore (O mi è sfuggito qualcosa o c'è qualcosa che non va!?) attraverso la creazione di un comodissimo User Control che ha un RaiseEvent e che in Runtime non mi viene richiamato! Comunque sia prima di postare il mio sorgente, voglio far presente che non ci sono Handles mancanti e penso di aver fatto tutte le dichiarazioni di classe ecc.

Questo il codice del Form1 (il Form principale :D)

Codice sorgente - presumibilmente VB.NET

  1. Imports MySql.Data.MySqlClient
  2. Imports DataSet_Tipizzati.AuthorViewer
  3. Public Class Form1
  4.     Private WithEvents avAuthor As New AuthorViewer
  5.  
  6.     Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  7.         Dim Conn As New MySqlConnection("server=localhost;database=appdata;user=root;password=miapassword;")
  8.         Dim Adapter As New MySqlDataAdapter
  9.         Conn.Open()
  10.  
  11.         'carica le tabelle nel dataset. Le tabelle sono ora
  12.         'accessibili mediante omonime proprietà
  13.         'dataset tipizzato
  14.  
  15.         Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Songs;", Conn)
  16.         Adapter.Fill(AppDataSet.Songs)
  17.  
  18.         Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Authors;", Conn)
  19.         Adapter.Fill(AppDataSet.Authors)
  20.  
  21.         Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Albums;", Conn)
  22.         Adapter.Fill(AppDataSet.Albums)
  23.  
  24.  
  25.         Conn.Close()
  26.     End Sub
  27.  
  28.  
  29.     Private Sub lb_songs_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles lb_songs.SelectedIndexChanged
  30.         If lb_songs.SelectedIndex < 0 Then
  31.             Exit Sub
  32.         End If
  33.  
  34.         'Trova la riga con ID specificato. Il tipo SongRow è stato
  35.         'definito dall'IDE durante la creazione del dataset tipizzato.
  36.         Dim S As AppDataSet.SongsRow = AppDataSet.Songs.FindByID(lb_songs.SelectedValue)
  37.  
  38.         lbName.Text = S.Title
  39.  
  40.         tabAuthor.Tag = Nothing
  41.         'Anche il metodo IsAuthorNull è stato definito dall'IDE.
  42.         'In generale, per ogni proprietà per cui non è stata
  43.         'specificata la clausola NOT NULL, l'IDE crea un metodo per
  44.         'verificare se quel dato attributo contiene un valore
  45.         'nullo. Equivale a chamare S.IsNull(3).
  46.  
  47.         If Not S.IsAuthorNull() Then
  48.             'Ottiene un array che contiene tutte le righe della
  49.             'tabella Authors che soddisfano la relazione definita
  50.             'tra Songs e Authors. Dato che la chiave esterna della tabella figlio era un ID,
  51.             'la relazione, pur essendo tericamente uno-a-molti, è in realtà uno-a-uno. Perciò, se questo array
  52.             'ha almeno un elemento, ne avrà solo uno.
  53.             Dim Authors() As AppDataSet.AuthorsRow = S.GetAuthorsRows()
  54.             'Come IsNull, questo metodo equivale a chiamare
  55.             'S.GetChildRows("Songs_Authors")
  56.  
  57.             'Imposta la proprietà  Author del controllo avAuthor,
  58.             'che non è altro che un'istanza di AuthorViewer,
  59.             'il controllo utente crato ad hoc
  60.  
  61.             If Authors.Length > 0 Then
  62.                 Dim Author As AppDataSet.AuthorsRow = Authors(0)
  63.                 avAuthor.Author = Author
  64.             Else
  65.                 avAuthor.Author = Nothing
  66.             End If
  67.  
  68.         End If
  69.  
  70.         tabAlbum.Tag = Nothing
  71.         If Not S.IsAlbumNull Then
  72.             Dim Albums() As AppDataSet.AlbumsRow = S.GetAlbumsRows
  73.  
  74.             If Albums.Length > 0 Then
  75.                 Dim Album As AppDataSet.AlbumsRow = Albums(0)
  76.  
  77.                 lbAlbumName.Text = Album.Name
  78.                 If Not Album.IsYearNull Then
  79.                     lbYear.Text = Album.Year
  80.                 Else
  81.                     lbYear.Text = ""
  82.                 End If
  83.                 If Not Album.IsImageNull Then
  84.                     imgAlbum.Image = Image.FromFile(Album.Image)
  85.                 Else
  86.                     imgAlbum.Image = Nothing
  87.                 End If
  88.                 If Not Album.IsDescriptionNull Then
  89.                     tbAlbumDescription.Text = Album.Description
  90.                 Else
  91.                     tbAlbumDescription.Text = ""
  92.                 End If
  93.                 tabAlbum.Tag = Album.ID
  94.             End If
  95.         End If
  96.     End Sub
  97.  
  98.  
  99.     Private Sub btSearch_Click(sender As System.Object, e As System.EventArgs) Handles btSearch.Click
  100.         If Not String.IsNullOrEmpty(tbSearch.Text) Then
  101.             'la proprietà Filter di un binding source è come
  102.             'una condizione SQL. In questo caso cerchiamo tutte le
  103.             'canzoni il cui titolo contenga la stringa specificata
  104.             SongsBindingSource.Filter = String.Format("title like '%{0}%'", tbSearch.Text)
  105.         Else
  106.             SongsBindingSource.Filter = ""
  107.         End If
  108.     End Sub
  109.  
  110.  
  111.     Private Sub avAuthor_AuthorAdded(sender As Object, e As System.EventArgs) Handles avAuthor.AuthorAdded
  112.         If lb_songs.SelectedIndex < 0 Then
  113.             Exit Sub
  114.         End If
  115.  
  116.         Dim S As AppDataSet.SongsRow = AppDataSet.Songs.FindByID(lb_songs.SelectedValue)
  117.         'imposta il campo Author della canzone corrente
  118.         S.Author = avAuthor.Author.ID
  119.     End Sub
  120.  
  121.     Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
  122.         Dim Conn As New MySqlConnection("server=localhost;database=appdata;user=root;password=miapassword;")
  123.         Dim Adapter As New MySqlDataAdapter
  124.  
  125.         'Un oggetto di tipo CommandBuilder genera automaticamente
  126.         'tutti le istruzioni update, INSERT IGNORE e delete che servono
  127.         'a un adapter per funzionare. Tali istruzioni vengono
  128.         'generate relativamente alla tabella dalla quale si stanno
  129.         'caricando i dati
  130.         Dim Builder As MySqlCommandBuilder
  131.  
  132.         Conn.Open()
  133.  
  134.         Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Songs;", Conn)
  135.         Builder = New MySqlCommandBuilder(Adapter)
  136.         Adapter.Update(AppDataSet.Songs)
  137.  
  138.         Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Authors;", Conn)
  139.         Builder = New MySqlCommandBuilder(Adapter)
  140.         Adapter.Update(AppDataSet.Authors)
  141.  
  142.         Adapter.SelectCommand = New MySqlCommand("SELECT * FROM Albums;", Conn)
  143.         Builder = New MySqlCommandBuilder(Adapter)
  144.         Adapter.Update(AppDataSet.Albums)
  145.  
  146.         Conn.Close()
  147.     End Sub
  148.  
  149. End Class



E questo il codice del Controllo Utente (8-|)

Codice sorgente - presumibilmente C#

  1. Public Class AuthorViewer
  2.     Private _Author As AppDataSet.AuthorsRow
  3.  
  4.     'Evento generato quando un autore viene aggiunto. Questo
  5.    'evento si verifica se l'utente salva dei cambiamenti
  6.    'quando la proprietà Author è Nothing.
  7.     'Non potendo modificare una riga esistente, quindi, ne
  8.    'viene creata una nuova. Poichè, tuttavia, questo
  9.     'autore deve essere associato alla canzone,
  10.    'bisogna che qualcuno ponga l'ID della nuova riga nel campo
  11.    'Author della canzone opportuna e, dato che questo controllo non può
  12.     'ne logicamente ne praticamente arrivare a fare ciò, bisogna che
  13.    'qualcun altro se ne occupi.
  14.  
  15.     Public Event AuthorAdded As EventHandler
  16.  
  17.     Public Property Author() As AppDataSet.AuthorsRow
  18.         Get
  19.             Return _Author
  20.         End Get
  21.         Set(value As AppDataSet.AuthorsRow)
  22.             If value IsNot Nothing Then
  23.                 _Author = value
  24.                 With value
  25.                     lbName.Text = .Name
  26.                     If Not .IsImageNull Then
  27.                         imgAuthor.ImageLocation = .Image
  28.                     Else
  29.                         imgAuthor.ImageLocation = Nothing
  30.                     End If
  31.                     If Not .IsDescriptionNull Then
  32.                         tbDescription.Text = .Description
  33.                     Else
  34.                         tbDescription.Text = ""
  35.                     End If
  36.                     imgSave.Visible = False
  37.                 End With
  38.             Else
  39.                 lbName.Text = "Nessun nome"
  40.                 imgAuthor.ImageLocation = Nothing
  41.                 tbDescription.Text = ""
  42.             End If
  43.         End Set
  44.     End Property
  45.  
  46.     Private Sub imgAuthor_Click(sender As System.Object, e As System.EventArgs) Handles imgAuthor.Click
  47.         'FOpen è un OpenFileDialog dichiarato nel designer.
  48.        'Questo codice serve per caricare un'immagine da disco fisso
  49.        If FOpen.ShowDialog = DialogResult.OK Then
  50.            imgAuthor.ImageLocation = FOpen.FileName
  51.            imgSave.Visible = True
  52.        End If
  53.    End Sub
  54.  
  55.    'L'immagine del floppy diventa visibile solo quando c'è stata
  56.     'una modifica, ossia è stato cambiato uno di questi parametri:
  57.    'nome, immagine, descrizione.
  58.  
  59.     Private Sub tbDescription_TextChanged(sender As System.Object, e As System.EventArgs) Handles tbDescription.TextChanged
  60.         imgSave.Visible = True
  61.     End Sub
  62.  
  63.     Private Sub lbName_Click(sender As System.Object, e As System.EventArgs) Handles lbName.Click
  64.         Dim NewName As String = InputBox("Inserire nome:")
  65.  
  66.         If Not String.IsNullOrEmpty(NewName) Then
  67.             lbName.Text = NewName
  68.             imgSave.Visible = True
  69.         End If
  70.     End Sub
  71.  
  72.     Private Sub imgSave_Click(sender As System.Object, e As System.EventArgs) Handles imgSave.Click
  73.         If _Author Is Nothing Then
  74.             'Crea la nuova riga e la inserisce nel dataset
  75.            'principale.
  76.             _Author = My.Forms.Form1.AppDataSet.Authors.AddAuthorsRow(lbName.Text, "", tbDescription.Text, imgAuthor.ImageLocation)
  77.             'Genera l'evento AuthorAdded
  78.             RaiseEvent AuthorAdded(Me, EventArgs.Empty)
  79.         Else
  80.             _Author.Name = lbName.Text
  81.             _Author.Description = tbDescription.Text
  82.             _Author.Image = imgAuthor.ImageLocation
  83.         End If
  84.         imgSave.Visible = False
  85.     End Sub
  86. End Class



:hail::hail::hail: Grazie Mille a Tutti!!!!! ;)

Ultima modifica effettuata da xplosiv il 20/09/2014 alle 13:14
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 18:50
Sabato, 20/09/2014
Nella guida il Totem ha scritto "Conn.Clone()" tu hai messo " Conn.Close()"

Ultima modifica effettuata da Ultimo il 20/09/2014 alle 18:52


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
xplosiv (Normal User)
Newbie


Messaggi: 5
Iscritto: 20/09/2014

Segnala al moderatore
Postato alle 19:16
Sabato, 20/09/2014
Testo quotato

Postato originariamente da Ultimo:

  Nella guida il Totem ha scritto "Conn.Clone()" tu hai messo " Conn.Close()"



Grazie Ultimo per la tua risposta, ma non è stata proficua, in quanto anche se utilizzo il membro della MySqlConnection  "Clone()" non succede alcun che! 8-|

Io ho utilizzato il membro Close() per chiudere la connessione con il database una volta caricato i dati sul DataSet, e una volta che viene chiusa l'applicazione!

Il mio problema, purtroppo, rimane ancora vivo! :d

Questo sorgente, dovrebbe, per come ho capito, utilizzare l'approccio standard, con le classi DataSet e DataTable, che rappresentano esattamente il database, con tutte le sue proprietà e caratteristiche, e grazie a questo, creare le righe della tabella chiamata in causa, nel caso specifico la tabella Author e per la quale viene aggiunto, grazie al Controllo Utente creato, un nuovo Autore ogni volta che si inseriscono i record per quella tabella e attraverso il click su un button viene aggiornato il DataSet!
Sin qui tutto ok! :k:
Ma quando si fa click sul tasto, dovrebbe scatenare l'evento AuthorAdded
Cioè:

Codice sorgente - presumibilmente C# / VB.NET

  1. RaiseEvent AuthorAdded(Me, EventArgs.Empty)



per fare in modo di assegnare, grazie alla relazione tra le tabelle, l'ID dell'Autore, alla canzone che viene selezionata nella ListView:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub avAuthor_AuthorAdded(sender As Object, e As System.EventArgs) Handles avAuthor.AuthorAdded
  2.         If lb_songs.SelectedIndex < 0 Then
  3.             Exit Sub
  4.         End If
  5.  
  6.         Dim S As AppDataSet.SongsRow = AppDataSet.Songs.FindByID(lb_songs.SelectedValue)
  7.         'imposta il campo Author della canzone corrente
  8.         S.Author = avAuthor.Author.ID
  9.     End Sub



Ma alla fin fine! Niente ID nella Tabella Songs che sfortunatamente rimane con il (NULL) presente nella riga! :om:

PM Quote
Avatar
xplosiv (Normal User)
Newbie


Messaggi: 5
Iscritto: 20/09/2014

Segnala al moderatore
Postato alle 19:25
Sabato, 20/09/2014
Giusto per capire posto anche questo bel ScreenShot della tabella su SQLyog, giusto per capire meglio il risultato non ottenuto:



xplosiv ha allegato un file: Cattura.PNG (14572 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 20:04
Sabato, 20/09/2014
Forse hai saltato qualcosa, rileggilo


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
xplosiv (Normal User)
Newbie


Messaggi: 5
Iscritto: 20/09/2014

Segnala al moderatore
Postato alle 21:00
Sabato, 20/09/2014
Testo quotato

Postato originariamente da Ultimo:

Forse hai saltato qualcosa, rileggilo  



No non credo! È già 3 giorni che mi scervello, ma non trovo ciò che manca! L'avró letto almeno 100 volte, e lo conosco a memoria! Mi sa che ci rinuncio! Più che altro mi serviva fare un po' di ripasso per una selezione a fine mese!

Grazie comunque.

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 23:51
Sabato, 20/09/2014
prova a zippare il sources, lo provo e vedo dove sbagli


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
xplosiv (Normal User)
Newbie


Messaggi: 5
Iscritto: 20/09/2014

Segnala al moderatore
Postato alle 1:17
Domenica, 21/09/2014
Ok, scusa Ultimo se posto solo ora, ma ero fuori casa! Qui è piena estate ancora, come penso anche li da te! :D

Vedi un po'!


xplosiv ha allegato un file: DataSet_Tipizzati.zip (329382 bytes)
Clicca qui per scaricare il file
PM Quote