Creare un piccolo forum

giovedì 11 giugno 2009 - 16.18

86Marco Profilo | Expert

Salve, per la mia applicazione web sto creando una piccola sezione forum.
Vi spiego come dovrà funzionare.
L'utente si ritroverà a inserire una discussione che poi invierà ad un database Access.
Nel tempo altri utenti potranno rispondere alla discussione mandando delle risposte (come un forum vero e proprio).

Il mio problema sta nella impostazione "grafica" del tutto.
Premetto che le tabelle che io ho sono:

Tabella DISCUSSIONI:
id
Autore
Data
Testo

Tabella RISPOSTE
ID
iddiscussione
Data
Autore
Note

Vorrei impostare tutto con un TreeView in modo tale che quando la pagina si carica automaticamente mi vengono stampate tutti i titoli delle discussioni, e facendo clic sul "+" relativo alla discussione che si vuole osservare vengano proposte tutte le risposte.

Un buon pezzo di codice (correttamente funzionante) l'ho già creato. Quello che non riesco a fare è la creazione del Nodo Figlio per ogni nodo principale. Vi posto l'intero codice qui sotto.


Dim con As New System.Data.OleDb.OleDbConnection
con.ConnectionString = ConfigurationManager.ConnectionStrings("Database").ToString
Dim reader As System.Data.OleDb.OleDbDataReader
Dim stringasql As String = "SELECT ID, Autore, Data, Testo FROM Discussione"
Dim cmd As New System.Data.OleDb.OleDbCommand(stringasql, con)
con.Open()
reader = cmd.ExecuteReader


Do While reader.Read

TreeView1.Nodes.Add(New TreeNode(reader("Testo") & "<br>", reader("ID")))

Dim reader2 As System.Data.OleDb.OleDbDataReader
Dim stringasql2 As String = "SELECT ID, iddiscussione, Data, Autore, Note FROM Risposte where iddiscussione=" & reader("ID")
Dim cmd1 As New System.Data.OleDb.OleDbCommand(stringasql2, con)
reader2 = cmd1.ExecuteReader

Do While reader2.Read

QUESTA E' LA RIGA CHE, SECONDO ME MI DA ERRORE, CHE NON RIESCO AD INIZIALIZZARE.
TreeView1.Nodes(reader("ID")).ChildNodes.Add(New TreeNode(reader2("Note" & "<br>")))

Loop

Loop
con.Close()

Spero sappiate aiutami.
è importante grazie

samar Profilo | Senior Member

Che errore viene generato?

86Marco Profilo | Expert

Index non compreso nell'intervallo. Richiesto valore non negativo e minore della dimensione dell'insieme.
Nome parametro: index
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack.

Dettagli eccezione: System.ArgumentOutOfRangeException: Index non compreso nell'intervallo. Richiesto valore non negativo e minore della dimensione dell'insieme.
Nome parametro: index

Errore nel codice sorgente:


Riga 26: Do While reader2.Read
Riga 27:
Riga 28: TreeView1.Nodes(reader("ID")).ChildNodes.Add(New TreeNode(reader2("Note") & "<br>"))
Riga 29: Response.Write(reader2("Note") & "<br>")
Riga 30: Loop

86Marco Profilo | Expert

nessuno sa aiutarmi???

Jeremy Profilo | Guru

Ciao Marco.
Hai provato a controllare il valore di reader("ID") in questa riga:
>TreeView1.Nodes(reader("ID")).ChildNodes.Add(New TreeNode(reader2("Note") & "<br>"))
sia un valore integer corrispondente all'indice di un nodo esistente???

Facci sapere...
Ciao

86Marco Profilo | Expert

CIao jeremy.
Infatti è l'errore che tento di risolvere da 2 giorni.
Praticamente non trova l'indice del nodo figlio... :( ma come posso risolverlo :( aiutoooooooooooooo

Jeremy Profilo | Guru

Ciao
Con TreeView1.Nodes(reader("ID")) fai riferimento ad un nodo Padre, prova a contare quanti nodi hai ed a verificare che il valore di reader("ID") sia compreso nell'intervallo.
Facci sapere...
Ciao

86Marco Profilo | Expert

il problema è che TreeView1.Nodes(reader("ID")) reader("ID") dovrebbe essere l'indice a base 0, mentre quest è un id relativo al contatore delle discussioni presenti nella tabella del database.
cio significa che avro discussioni con contatore da 1 in poi e tra l'altro posso anche avere id a saltare presumendo che una o + discussioni possono essere cancellati dal database...
non sai proprio come posso risolvere???

Jeremy Profilo | Guru

Ciao.
Allora .... fammi capire bene.....cosa intendi fare con quell'istruzione????
Supponiamo che il valore di reader("ID") sia 5.

Tu vorresti visualizzare il primo come nodo padre(domanda) e i successivi(risposte) come nodi figlio ..... giusto??

Facci sapere...
Ciao

Jeremy Profilo | Guru

Ciao.
Devi primare creare il nodo padre per poi poter fare riferimento ad esso per creare i nodi figlio.
Quindi:

TreeView1.Nodes.Add(New TreeNode(reader("ID").Tostring,reader("Descrizione").Tostring) TreeView1.Nodes(reader("ID")).Nodes.Add(New TreeNode(reader2("Note" & "<br>")))

Altrimenti non ho capito cosa intendi fare..
Facci sapere...
Ciao

86Marco Profilo | Expert

Ciao, innanzitutto grazie per la risp.
Si cmq io vorrei visualizzare il primo come nodo padre(domanda) e i successivi(risposte) come nodi figlio ..... :) ti prego aiutami se puoi!!

86Marco Profilo | Expert

Ciao, ti spiego meglio cosa dovrei riuscire a fare.
Ti posto l'immagine del database access che contiene le tabelle discussioni e risposte.


610x370 60Kb


Materialmente vorrei che mi si visualizzasse una schermata come questa

+ Prima discussione
+ Seconda discussione
+ Terza discussione

ogni qualvolta faccio clic su di una discussione deve visualiazzarmi le risposte presenti all'interno del database di quella discussione...
Ti prego saresti cosi gentile da aiutarmi o magari produrmi un piccolo esempio??
Grazie veramente tanto

Jeremy Profilo | Guru

Ciao Marco.
Stasera provo a metter giù qualcosa....intanto se puoi, posta(o allega) la struttura delle tabelle del Db.
Ciao.

86Marco Profilo | Expert

grazie.
ti allego il database di esempio.
Ciao

Jeremy Profilo | Guru

Ciao Marco.
In allegato un piccolissimo esempio....spero sia quello che ti serviva.
In quanto alla tecnica di programmazione ho deciso di utilizzare il tuo stesso codice, semplicemente, sistemando qualche errore.

Rimango comunque a disposizione per ulteriori info.

Facci sapere...
Ciao

86Marco Profilo | Expert

Ciao ho provato a trasformare il tuo codice in ASP.NET e comunque non mi restituisce ciò che desidero.
Questo è il codice "trasformato"


Dim con As New System.Data.OleDb.OleDbConnection
con.ConnectionString = ConfigurationManager.ConnectionStrings("Database").ToString
Dim reader As System.Data.OleDb.OleDbDataReader
Dim stringasql As String = "SELECT ID, Autore, Data, Testo FROM Discussione"
Dim cmd As New System.Data.OleDb.OleDbCommand(stringasql, con)
con.Open()
reader = cmd.ExecuteReader
Do While reader.Read

TreeView1.Nodes.Add(New TreeNode(reader("ID".ToString), reader("testo".ToString)))
Dim reader2 As System.Data.OleDb.OleDbDataReader
Dim stringasql2 As String = "SELECT ID, iddiscussione, Data, Autore, Note FROM Risposte where iddiscussione=" & reader("ID").ToString
Dim cmd1 As New System.Data.OleDb.OleDbCommand(stringasql2, con)
reader2 = cmd1.ExecuteReader
Do While reader2.Read

TreeView1.Nodes.Add(New TreeNode(reader("ID".ToString), reader("Testo".ToString)))


Loop
Loop
con.Close()

Mentre questo è il risultato che mi si propone, errato ovviamente.... :( nn so più che csa fare!

137x213 11Kb

Jeremy Profilo | Guru

Ciao Marco.
Scusa ... non mi ricordavo che era per ASP.NET
Quindi, questa riga.
>TreeView1.Nodes.Add(New TreeNode(reader("ID".ToString), reader("testo".ToString)))
prova a modificarla in questo modo:
TreeView1.Nodes.Add(New TreeNode(reader("testo").ToString, reader("ID").ToString)


Facci sapere...
Ciao

86Marco Profilo | Expert

Allora diciamo che ci siamo moooolto avvicinati a cio che volevo io.
L'unica cosa è che vrei voluto che le risposte delle varie discussioni si vedessero come nodi figlio, avendo una visualizzazione del genere:

+ Prima discussione
+ Seconda discussione
+ Terza discussione

nel caso in cui facessi clic sul "+" relativo alla discussione 2 mi faceva vedere le risposte date alla discussione... come fare???

Questo è il risultato che ottengo con l'ultimo codice:

188x207 20Kb

Jeremy Profilo | Guru

Ciao Marco.
Ma il mio esempio, mi sa che non lo hai prorpio guardato!!!

Questa parte:
>Do While reader2.Read
>TreeView1.Nodes.Add(New TreeNode(reader("ID".ToString), reader("Testo".ToString)))
>Loop

Deve diventare:
Do While reader2.Read TreeView1.Nodes(reader("ID").ToString).Nodes.Add(new TreeNode(reader2("Note").ToString)) Loop

Facci sapere...
Ciao

86Marco Profilo | Expert

ho provato in questa maniera in quanto la striunga da te scritta non è possibile crearla.


Do While reader2.Read

TreeView1.Nodes(reader("ID").ToString).ChildNodes.Add(New TreeNode(reader2("Note").ToString))
Loop

E ricevo il seguente errore :), (xdonami e grazie mille per la tua pazienza).

Index non compreso nell'intervallo. Richiesto valore non negativo e minore della dimensione dell'insieme.
Nome parametro: index
Descrizione: Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere l'analisi dello stack.

Dettagli eccezione: System.ArgumentOutOfRangeException: Index non compreso nell'intervallo. Richiesto valore non negativo e minore della dimensione dell'insieme.
Nome parametro: index

Errore nel codice sorgente:


Riga 25: Do While reader2.Read
Riga 26:
Riga 27: TreeView1.Nodes(reader("ID").ToString).ChildNodes.Add(New TreeNode(reader2("Note").ToString))
Riga 28: Loop
Riga 29:

Jeremy Profilo | Guru

Ciao Marco.
Ti chiedo infinitamente scusa, ma non ho modo di fare il debug di una applicazione Web.
Per il momento aggiustalo così:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Appena ho modo di fare delle prove di do il codice corretto.
Grazie e scusa ancora.
Ciao.

86Marco Profilo | Expert

è perfetto mille grazieeeeee ;)

Jeremy Profilo | Guru

Ciao Marco.
Incredibile!!! Ho dovuto formattare il Pc per poter finalmente riuscire di nuovo a debuggare le WebApplication.
Ad ogni modo, questo è il codice corretto.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Come vedi, uso il metodo FindNode per cercare il node al quale aggiungere i nodi figlio.

Ciao

86Marco Profilo | Expert

ah ecco benssimo.... ma come vedo anche il tuo che mi hai dato prima funzionava bene :)

Jeremy Profilo | Guru

>ah ecco benssimo.... ma come vedo anche il tuo che mi hai dato
>prima funzionava bene :)
Si ma era un accrocchio
Ciao.

86Marco Profilo | Expert

benissimo ... grazie mille... chiudo questo post.
Ho anche aperto una nuova discussione.. se puoi darmi aiuto anche in questa... Grazie veramente comunque tante per la tua pazienza e gentulezza.

http://www.dotnethell.it/forum/messages.aspx?ThreadID=31054
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5