View Full Version : [VB.NET08EE]
radeon_snorky
17-01-2009, 15:07
salve a tutti!
ho appena finito di realizzare il mio primo programma (funzionanete...)
"scritto" in vb.net...
perché l'ho scritto tra parentesi?
perché non ho dovuto praticamente usare mai la tastiera, ho solo trascinato quel che mi serviva sul form...
l'applicazione si appoggia ad un file mdb che contiene delle tabelle che vanno a popolare la tabella principale, in
definitiva si tratta di una applicazione per la gestione della pratiche di un ufficio.
per ora ho utilizzato solo gli strumenti che .net mette a disposizione, primo su tutti, la barra che gestiche le righe...
ora vorrei personalizzare il programma, e vorrei un aiuto da parte vostra:
1)
il salvataggio delle pratiche (modifiche a pratiche già inserite o completamente nuove) vorrei che fosse sempre preceduto da un avviso - la messagebox sarebbe tipo "Confermi i dati: <camp01><campo2>" alla pressione di OK il salvataggio viene portato a termine mentre con ANNULLA si ritorna alla form e il programma "rilegge" i dati dal db precedenti le modifiche.
così facendo si ha un controllo sulle modifiche alle pratiche esistenti e contemporaneamente una veloce ricapitolazione dei campi inseriti nelle nuove pratiche
2)
controllo cancellazione pratiche, se non sbaglio l'approccio al problema dovrebbe essere simile al punto 1, giusto? con l'unica differenza che l'unica pratica cancellabile può essere solo e soltanto l'ultima inserita
3)
gestire meglio il numero associato alla pratica...
ho notato che se si cancella una pratica il contatore che ho inserito (è un contatore del file mdb...) continua imperterrito ad aumentare senza preoccuparsi che delle righe siano state eliminate dite che devo aggiungere del codice per insegnargli a contare o aggiungo una colonna numero al mio mdb e uso quella con un controllo che mi dica "ultima pratica + 1" o roba simile?
4)
gestire avvisi scadenze
alcune pratiche devono essere completate in un determinato periodo di tempo, hanno quindi una scadenza, gestita con un campo "data", altre hanno ricorrenze annuali, biennali, triennali e così via; vorrei poter disporre di un sistema visivo per avere sott'occhio queste particolari pratiche.
esempio:
sfondo normale -> pratica standard/senza scadenza/completata/ecc.
sfondo verde -> pratica a ricorrenza annuale o più che sia in scadenza a 6 mesi (di solito sono pratiche che richiedono molto tempo per essere chiuse)
sfondo arancione -> pratica con scadenza a una settimana
sfondo rosso -> pratica con scadenza un giorno
pratica scaduta -> messagebox che ti avvisa della scadenza e ti visualizzala pratica per chiuderla o modificarla
5)
gestire le pratiche chiuse
mi serve un modo per inibire la modifica alle pratiche definite chiuse (ho un bolean nell'mdb) non so proprio come implementarlo
chi mi aiuta?
radeon_snorky
19-01-2009, 10:21
se faccio un UP vado contro il regolamento?
aiutatemi, vi scongiuro! :cry:
wizard1993
19-01-2009, 10:39
non è difficile fare quello che vuoi, ma purtroppo non siamo in molti a sapere il VB.net, in java te lo saprei dire senza esitazioni, ma in vb assolutamente no, aspetta MarcoGG, lui saprà consigliarit
Beh, in pratica stai chiedendo a qualcuno di farti il programma... :D
1. Puoi usare una msgbox di VB "preconfezionata" con pulsanti yes/no/cancel ( MsgBoxStyle.YesNoCancel ), o fartene una tua con una piccola Form... Non è difficile.
2. Esatto. Ma devi prima gestire l'id numerico ( suppongo chiave primaria ) per fare in modo che il numero più alto sia associato sempre alla pratica più recente, il che ci porta al punto 3.
3. Non è sempre sbagliato usare il contatore di Access, anche se molti lo indicano come pratica da principianti. Un limite molto fastidioso è che il contatore ignora gli spazi vuoti nella numerazione, lasciati da eventuali voci eliminate. Se vuoi che non vi siano spazi vuoti tra gli id numerici, devi crearti tu un contatore numerico, e una routine VB che controlla ad ogni inserimento, l'ultimo id disponibile e lo incrementa di 1, e ad ogni cancellazione esegue lo "shift" verso l'alto degli id successivi al "buco" che si è creato...
Devo avere qualcosa di già pronto in giro, ma al momento non ho proprio tempo di cercarla... Sorry.
4. Semplicemente interroghi il campo scadenza ed agisci di conseguenza. Userai una Select Case per modificare i colori e/o far apparire le messagebox che desideri...
5. Il boolean non è l'unico modo. Più semplicemente ancora fai un campo numerico "attiva" che può essere 1 ( pratica attiva ) oppure 0 ( non attiva ), semplice da settare/leggere.
Cmq, in generale te la puoi cavare con una conoscenza base di VB, su tutti i quesiti. Magari prova a sbatterci un po' la testa, suddividendo il problema in sotto-problemi e chiedi aiuti più specifici... Ciao. ;)
radeon_snorky
20-01-2009, 17:10
Beh, in pratica stai chiedendo a qualcuno di farti il programma... :D non è vero!!! :mc:
1. Puoi usare una msgbox di VB "preconfezionata" con pulsanti yes/no/cancel ( MsgBoxStyle.YesNoCancel ), o fartene una tua con una piccola Form... Non è difficile.farla non è un problema, è implementarla che mi riesce difficile...
2. Esatto. Ma devi prima gestire l'id numerico ( suppongo chiave primaria ) per fare in modo che il numero più alto sia associato sempre alla pratica più recente, il che ci porta al punto 3.ecco il secondo problema... il "quando" (nel senso di dove) scrivere del codice (dichiarare variabili, costanti, ecc..)
3. Non è sempre sbagliato usare il contatore di Access, anche se molti lo indicano come pratica da principianti. Un limite molto fastidioso è che il contatore ignora gli spazi vuoti nella numerazione, lasciati da eventuali voci eliminate. Se vuoi che non vi siano spazi vuoti tra gli id numerici, devi crearti tu un contatore numerico, e una routine VB che controlla ad ogni inserimento, l'ultimo id disponibile e lo incrementa di 1, e ad ogni cancellazione esegue lo "shift" verso l'alto degli id successivi al "buco" che si è creato...
Devo avere qualcosa di già pronto in giro, ma al momento non ho proprio tempo di cercarla... Sorry.intanto vedo di inventarmi qualcosa... in effetti stavo già pensando di far diversamente
4. Semplicemente interroghi il campo scadenza ed agisci di conseguenza. Userai una Select Case per modificare i colori e/o far apparire le messagebox che desideri...forse risulta la cosa meno problematica
5. Il boolean non è l'unico modo. Più semplicemente ancora fai un campo numerico "attiva" che può essere 1 ( pratica attiva ) oppure 0 ( non attiva ), semplice da settare/leggere.qui mi dovrai aiutare parecchio
Cmq, in generale te la puoi cavare con una conoscenza base di VB, su tutti i quesiti. Magari prova a sbatterci un po' la testa, suddividendo il problema in sotto-problemi e chiedi aiuti più specifici... Ciao. ;)conoscenza che non ho purtroppo...
vediamo di sbatterci la testa allora!!!!
grazie, a risentirci
radeon_snorky
24-01-2009, 14:53
ho riempito di messagebox il mio programma...
peccato che alla pressione sia di "OK" sia di "annulla" o altro.. succede sempre la stessa cosa!
cosa dovrei imparare? try catch for if o ke????
intanto mi son messo a cercare informazioni su come poter modificare la connessione al database e ho trovato questo:
http://www.codeproject.com/KB/vb/PersistConnectionStrings.aspx
la mia intenzione è aggiungere un menu "setting" dove poter inserire il percorso del file mdb che serve al programma (l'intenzione è di installare il programma su più pc ed avere un solo file mdb, quindi ogni programma deve avere la possibilità di modificare la propria connettionstrings...)
piano piano procedo...
grazie a chi vorrà ancora aiutarmi :D
ho riempito di messagebox il mio programma...
peccato che alla pressione sia di "OK" sia di "annulla" o altro.. succede sempre la stessa cosa!
cosa dovrei imparare? try catch for if o ke????
No. Devi interrogare il valore di ritorno della funzione MsgBox. Si può fare in diversi modi, io uso sempre questo standard :
Dim strMessaggio As String = "Attenzione! Eseguire?"
Dim msgR As MsgBoxResult
msgR = MsgBox(strMessaggio, MsgBoxStyle.YesNoCancel, "Scegli.")
Select Case msgR
Case MsgBoxResult.Yes
MsgBox("SI")
Case MsgBoxResult.No
MsgBox("NO")
Case MsgBoxResult.Cancel
MsgBox("ANNULLA")
End Select
intanto mi son messo a cercare informazioni su come poter modificare la connessione al database e ho trovato questo:
http://www.codeproject.com/KB/vb/PersistConnectionStrings.aspx
la mia intenzione è aggiungere un menu "setting" dove poter inserire il percorso del file mdb che serve al programma (l'intenzione è di installare il programma su più pc ed avere un solo file mdb, quindi ogni programma deve avere la possibilità di modificare la propria connettionstrings...)
O ancora più semplicemente, se distribuisci il DB Access assieme all'applicativo, inserire percorsi relativi nelle stringhe di connessione. In questo modo il programma va a cercarsi da solo il DB, e non si può sbagliare :
Dim percorsoDB As String = Application.StartupPath & "\CartellaDB\"
Dim nomeDB As String = "fileDB.mdb"
Dim strCN As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
percorsoDB & nomeDB & ";Persist Security Info=False"
;)
radeon_snorky
25-01-2009, 20:18
nel frattempo avevo trovato questo:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal_
As System.EventArgs) Handles Button1.Click
Dim result As MsgBoxResult
result = MsgBox("Tuo Testo", MsgBoxStyle.YesNo)
If result = MsgBoxResult.Yes Then
tuo codice
Else If result = MsgBoxResult.No Then
tuo codice
End If
End Sub interessante sapere come lo stesso fine può essere raggiunto in + modi (e mi interesserebbe sapere in effetti quali sono le "differenze" nei 2 codici)
per la seconda questione... i percorsi relativi mi giravano nella testa ma non sapevo proprio come implementarli! grande MarcoGG! grazie 1000!!!
radeon_snorky
26-01-2009, 18:29
se distribuisci il DB Access assieme all'applicativo, inserire percorsi relativi nelle stringhe di connessione. In questo modo il programma va a cercarsi da solo il DB, e non si può sbagliare :
il db viene inserito in una cartella su un fileserver linux (già configurato e in ordine) il programma vorrei installarlo sui singoli pc e deve (automaticamente o con inserimento del percorso) poter accedere al file.
non ho modo di verificarne il funzionamento fino al momento dell'installazione.
siamo sulla strada giusta o il codice che mi hai passato non serve allo scopo?
Il concetto è sempre lo stesso.
Hai N client che vedono un unico DB Access su server. Ovviamente gli utenti devono avere libero accesso alla cartella in cui si trova il DB.
Basterà impostare la Connection String nel modo appropriato. Su Linux non ho provato, ma in Win senza dubbio questa funziona :
Dim strCN As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
"\\" & nomeMacchina & "\" & nomeDirCondivisa & "\" & nomeDB & _
";Persist Security Info=False"
;)
radeon_snorky
27-01-2009, 08:05
;)grazie! proverò...
adesso però mi sto "studiando" la gestione degli errori, ho trovato un pdf e parecchie guide.
il fatto è che che mi era (quasi) chiaro il concetto "on error goto" ma non avendolo mai applicato... ora son cambiate molte cose e mi trovo spaesato.
probabilmente ho scritto tutto il codice giusto ma non l'ho messo nel posto corretto!
in definitiva, un evento deve poter accadere solo in presenza di certe condizioni (combobox non vuote) se mancano le condizioni un messaggio avverte e FA TORNARE alla form senza altri cambiamenti, se le condizioni sono rispettate invece un altro messaggio avvisa del completamento dell'evento se si clicca su ok altrimenti se si clicca su annulla FA TORNARE alla form senza altri cambiamenti.
intanto studio.... :D
Update richiede un UpdateCommand valido se l'insieme DataRow viene passato con righe modificate
Scusa ma non ho chiaro cosa stai cercando di fare e il perchè dell'errore...
In generale forse ti sei appoggiato troppo alle tecniche "veloci" di connessione DB di .Net ( se sei agli inizi, il mio consiglio è lo stesso dato qui a chi chiedeva su C# : http://www.hwupgrade.it/forum/showthread.php?t=1913387 ). All'inizio è meglio scrivere codice, non preoccuparsi di essere prolisso, lasciar stare l'ottimizzazione e capire come funziona Ado .Net...
Non puoi farci niente, all'inizio devi faticare !
P.S.: meglio continuare nel Thread, anzichè con i pvt. ;)
radeon_snorky
02-02-2009, 18:50
Scusa ma non ho chiaro cosa stai cercando di fare e il perchè dell'errore...
In generale forse ti sei appoggiato troppo alle tecniche "veloci" di connessione DB di .Net ( se sei agli inizi, il mio consiglio è lo stesso dato qui a chi chiedeva su C# : http://www.hwupgrade.it/forum/showthread.php?t=1913387 ). All'inizio è meglio scrivere codice, non preoccuparsi di essere prolisso, lasciar stare l'ottimizzazione e capire come funziona Ado .Net...
Non puoi farci niente, all'inizio devi faticare !
P.S.: meglio continuare nel Thread, anzichè con i pvt. ;)non posso fare altrimenti!
purtroppo non ho il tempo materiale di mettermi ad imparare cose che in definitiva sono un passatempo (lo dico perché mi son reso conto di non aver tempo nemmeno di farmi una lavatrice come si deve... :doh: )
comunque sono riuscito a realizzare qualcosa! è completo al 99%.. e ADESSO sembra funzionare!
mi manca solo la gestione di una textbox o maskedtextbox, sicuramente meglio la seconda ma non so come gestire un:
if <> ""
che nella textbox è comodo ma nella masked non molto...
in definitiva devo vincolare l'utente ad inserire un numero (es. 001/09) che sarebbe "pratica/anno" ma devo anche poter verificare se le ha lasciate vuote "___/__" o scritte male "oo1/09" come è meglio procedere? inserendo tutta una serie di if o che?
help
in definitiva devo vincolare l'utente ad inserire un numero (es. 001/09) che sarebbe "pratica/anno" ma devo anche poter verificare se le ha lasciate vuote "___/__" o scritte male "oo1/09" come è meglio procedere? inserendo tutta una serie di if o che?
Se usi una MaskedTextBox puoi limitare l'immissione di caratteri indesiderati ed ottenere già molto senza scrivere codice.
Nel tuo caso basta specificare 000/00 nella proprietà Mask.
A questo punto se provi a scrivere caratteri non-numerici vedari che non è possibile. ;)
Per le immissioni parziali, bastano 3 righe di codice :
If MaskedTextBox1.Text.Length < MaskedTextBox1.Mask.Length _
Or MaskedTextBox1.Text.Contains(" ") Then
MsgBox("Input Incompleto.")
End If
E il gioco è fatto.
Faccio notare che questo codice è valido per qualsiasi Masked che accetti solo caratteri numerici ! ;)
radeon_snorky
03-02-2009, 10:31
adesso ci provo... ma...
mi sa che mi sono incartato...
vecchio codice
il copia-incolla ha mietuto vittime, mi dai una mano a sistemare il codice?
...EDIT...
ho sistemato in questo modo, è "grammaticalmente" corretto?
Private Sub PraticaBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PraticaBindingNavigatorSaveItem.Click
If N_pratMaskedTextBox.Text.Length < N_pratMaskedTextBox.Mask.Length Or N_pratMaskedTextBox.Text.Contains(" ") Or N_pratMaskedTextBox.Text.Trim.Length = 0 Then
MessageBox.Show("Devi inserire un numero di pratica!", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Exit Sub
End If
If IDpvfComboBox.Text.Trim.Length = 0 Then
MessageBox.Show("Devi inserire un punto vendita!", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Exit Sub
End If
Select Case MessageBox.Show("Confermi il salvataggio della paratica:" & vbCrLf & vbCrLf & "Pratica:" & N_pratMaskedTextBox.Text & vbCrLf & "Punto vendita:" & IDpvfComboBox.Text, "Salvataggio", MessageBoxButtons.YesNo, MessageBoxIcon.Information)
Case DialogResult.Yes
Try
Me.Validate()
Me.PraticaBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.PraticheDataSet)
Catch ex As Exception
MessageBox.Show("Devi inserire un punto vendita!", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Finally
MessageBox.Show("Salvataggio eseguito con successo")
End Try
Case DialogResult.No
MessageBox.Show("Salvataggio annullato")
Me.PraticaBindingSource.CancelEdit()
Exit Sub
End Select
End Sub
ho usato trim.length ho sbagliato?
If N_pratMaskedTextBox.Text.Length < N_pratMaskedTextBox.Mask.Length Or N_pratMaskedTextBox.Text.Contains(" ") Or N_pratMaskedTextBox.Text.Trim.Length = 0 Then
MessageBox.Show("Devi inserire un numero di pratica!", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Exit Sub
End If
If IDpvfComboBox.Text.Trim.Length = 0 Then
MessageBox.Show("Devi inserire un punto vendita!", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Exit Sub
End If
Allora, nel primo caso diciamo che hai applicato quanto ti avevo suggerito, ma apportando una modifica ( mi riferisco a quel : Or N_pratMaskedTextBox.Text.Trim.Length = 0 ) che è inutile.
Infatti se la Masked ha Mask = 000/00, nel caso in cui l'utente non inserisca niente, non ritornerà mai stringa vuota ( "" ), ma almeno " /".
I caratteri prima del "/" sono 3 spazi, e se provi a interrogare la proprietà .Text.Length della Masked vuota ricevi risultato = 4.
Se fai la Trim ricevi comunque 1 ( il solo "/" ).
Perciò l'ultima condizione Or è superflua, non verrà mai verificata e inoltre era già inclusa nel mio codice. ;)
Nel secondo caso ( Combo ) se l'intento è di interrogare la stringa al netto degli spazi pre e post, hai scritto correttamente. ;)
radeon_snorky
03-02-2009, 20:16
Perciò l'ultima condizione Or è superflua, non verrà mai verificata e inoltre era già inclusa nel mio codice. ;) il fatto è che con il tuo codice non "girava" come volevo, aggiungendo il "mio" pezzo il comportamento è come me lo aspettavo... ma domani ci rimetto le mani... di sicuro se lo dici tu.... è così!:)
il fatto è che con il tuo codice non "girava" come volevo, aggiungendo il "mio" pezzo il comportamento è come me lo aspettavo... ma domani ci rimetto le mani... di sicuro se lo dici tu.... è così!:)
E' molto semplice, basta suddividere quell'If nelle 3 istruzioni :
If MaskedTextBox1.Text.Length < MaskedTextBox1.Mask.Length Then
'Errore immissione 1
MsgBox("ERRORE su Text.Length")
End If
If MaskedTextBox1.Text.Contains(" ") Then
'Errore immissione 2
MsgBox("ERRORE su Text.Contains("" "")")
End If
If MaskedTextBox1.Text.Trim.Length = 0 Then
'Errore immissione 3
MsgBox("ERRORE su Text.Trim.Length")
End If
La terza If è quella che hai aggiunto tu.
A questo punto fai qualche test.
Esempi :
- L'utente scrive 123/__ : Errore immissione 1
- L'utente scrive 1__/_3 : Errore immissione 2
- L'utente scrive ___/_1 : Errore immissione 2
- L'utente non scrive nulla ( ___/__ ) : Errore immissione 1 + 2
E cmq, Errore immissione 3 non si verifica mai... ;)
radeon_snorky
10-02-2009, 19:53
ho messo tutto in ordine, ora gira che è un piacere...
ho infarcito il programma di avvisi se qualcosa non è corretto (al salvataggio, all'aggiunta, ecc...)
adesso sembra la divina commedia!
sto cercando di capire come mai non mi funzionano il .focus () e il selectall ().... vorrei che ad ogni errore il cursore si posizionasse sulla box che non è corretta e la evidenziasse.
ha funzionato 2 volte poi al terzo debug non più...
altra cosa:
vorrei implementare il drag&drop di cartelle, nel senso che ho un linklabel che vorrei impostare come la directory che ci trascino sopra (ora ho un button che attiva una FolderBrowserDialog.... abbastanza brutterella e poco comoda: spesso ho dei percorsi molto lunghi)
ho cercato su msdn ma l'inglese mi rimane sempre indigesto
radeon_snorky
12-02-2009, 15:45
SELECT Pratica.n_prat, Pratica.IDpvf, Pratica.IDcliente, Pratica.IDsocietà, Pratica.IDincaricato, Pratica.Oggetto, Pratica.Data_inizio, Pratica.Data_fine, Pratica.[Campo si/no], Pratica.allegato
FROM (Pratica INNER JOIN Rubrica ON Pratica.IDpvf = Rubrica.IDpvf)
WHERE (Rubrica.PVF LIKE '%' + @PVF + '%')
mi sono bloccato coi filtri... questo codice non mi funziona! dice che non è corretto dopo @ ma ho provato a chiamarlo in tutte le maniere!!!!
nella form ho un button e una combobox con cui vorrei filtrare le righe
help me!
radeon_snorky
17-02-2009, 12:56
Errore 1 l'elemento "obj\Debug\Gestione_Pratiche_EFFEQ.filtroPVF.resources" è stato specificato più di una volta nel parametro "Resources". Il parametro "Resources" non supporta elementi duplicati. programma
AIUTO!!!
ho fatto un copia incolla e adesso mi da questo errore!!!!
volevo solo riutilizzare un form...
cosa faccio?!?!?!!?
Semplice. Quella Form si porta dietro una risorsa incorporata. Copiandola chiedi a VS di creare 2 risorse con lo stesso nome e percorso.
Fai in modo che le 2 Form vedano la stessa, unica risorsa...
radeon_snorky
19-02-2009, 13:48
Semplice. Quella Form si porta dietro una risorsa incorporata. Copiandola chiedi a VS di creare 2 risorse con lo stesso nome e percorso.
Fai in modo che le 2 Form vedano la stessa, unica risorsa...ho chiuso e riaperto il progetto e tutto si è risolto... bah!
devo realizzare una form (o dialog?) con una combobox e un tasto ok
il titolo della form, il contenuto della combo e gli effetti alla pressione del tasto
variano a seconda che siano richiamati da 6 diversi pulsanti (son 6 filtri)
meglio realizzare 6 diverse form o è meglio (e c'è il modo...) di utilizzare la stessa form e applicarla alla bisogna?
______________
EDIT
per completezza mi autocito e ricapitolo:
sto cercando di capire come mai non mi funzionano il .focus () e il selectall ().... vorrei che ad ogni errore il cursore si posizionasse sulla box che non è corretta e la evidenziasse.
ha funzionato 2 volte poi al terzo debug non più
...
vorrei implementare il drag&drop di cartelle...
il focus delle combo con errori non l'ho ancora risolto!
il drag&drop invece si!
mi sono bloccato coi filtri... questo codice non mi funziona! dice che non è corretto dopo @ ma ho provato a chiamarlo in tutte le maniere!!!!
nella form ho un button e una combobox con cui vorrei filtrare le righe
help me!
qui non ho ancora capito come implementare i filti dei dati... ado linq sql non ci capisco una fava
devo realizzare una form (o dialog?) con una combobox e un tasto ok
il titolo della form, il contenuto della combo e gli effetti alla pressione del tasto
variano a seconda che siano richiamati da 6 diversi pulsanti (son 6 filtri)
meglio realizzare 6 diverse form o è meglio (e c'è il modo...) di utilizzare la stessa form e applicarla alla bisogna?
O meglio ancora, fossi in te incorporerei tutto nella Form chiamante. Dividere un flusso così semplice in 2 Form mi pare superfluo...
il focus delle combo con errori non l'ho ancora risolto!
il drag&drop invece si!
Non so, a me pare davvero elementare :
ComboBox1.Focus()
Se per caso hai una Combo dove DropDownStyle = DropDownList, ovviamente quest'operazione non ti permetterà di modificare il testo, ma solo di selezionarlo, in quanto la Combo è in modalità "sola lettura"...
qui non ho ancora capito come implementare i filti dei dati... ado linq sql non ci capisco una fava
ADO è ok, ma forse usi Access come base dati, e ricordo che in più di un'occasione mi ha dato grattacapi con l'operatore LIKE... :(
Dovrei provare...
radeon_snorky
21-02-2009, 13:18
O meglio ancora, fossi in te incorporerei tutto nella Form chiamante. Dividere un flusso così semplice in 2 Form mi pare superfluo...beh... si! è che mi ero fissato sul fatto che due combobox con gli stessi dati dentro potessero generare problemi nella stessa form...
Non so, a me pare davvero elementare :
ComboBox1.Focus()
Se per caso hai una Combo dove DropDownStyle = DropDownList, ovviamente quest'operazione non ti permetterà di modificare il testo, ma solo di selezionarlo, in quanto la Combo è in modalità "sola lettura"...pure a me pare di una semplicità disarmante... ma il focus non si verifica! proverò a spostarlo
ADO è ok, ma forse usi Access come base dati, e ricordo che in più di un'occasione mi ha dato grattacapi con l'operatore LIKE... :(
Dovrei provare...si uso access... il fatto è che, tra l'altro..., non riesco nemmeno a far visualizzare nelle combo i dati da usare come filtri; faccio nello stesso modo che ho usato per popolare le combo per le "pratiche", solo che uso come base le tabelle "cliente" "incaricato" ecc...
per maggior chiarezza credo che dovrei almeno postare uno screen del programma, o sbaglio?
pure a me pare di una semplicità disarmante... ma il focus non si verifica! proverò a spostarlo
Il .Focus() dovrebbe stare sempre come ultimissima istruzione della routine interessata. Ovvio che se metti un .Focus() in mezzo ad altre istruzioni è possibile che venga eseguito/annullato in un istante...
Più in generale se si usano istruzioni che eseguono un cambiamento di stato nell'interfaccia grafica è sempre possibile che, ad esempio in presenza di cicli "pesanti", vengano in pratica ignorate.
Cmq, VB mette a disposizione l'utilissima istruzione
Application.DoEvents()
che ha l'effetto di forzare tali cambiamenti... ;)
si uso access... il fatto è che, tra l'altro..., non riesco nemmeno a far visualizzare nelle combo i dati da usare come filtri; faccio nello stesso modo che ho usato per popolare le combo per le "pratiche", solo che uso come base le tabelle "cliente" "incaricato" ecc...
per maggior chiarezza credo che dovrei almeno postare uno screen del programma, o sbaglio?
Non credo che uno screen risolva nulla. Prova a postare il codice completo che usi per popolare quelle Combo.
Per il discorso del LIKE su Access, personalmente evito di usarlo e faccio fare tutto a VB ( ad esempio ponendo semplici condizioni ai DataReader che funzionino come il LIKE... ) ;)
radeon_snorky
23-02-2009, 18:26
;)
per il focus ho risolto, avevo fatto casino io!
per il resto c'ho ancora parecchio da studiare :muro:
radeon_snorky
24-02-2009, 18:51
sto cercando di riscrivere il programma senza gli "aiutini"...
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim objconn As OleDb.OleDbConnection
Dim stringaconn As String
Dim FileDB As New OpenFileDialog()
MessageBox.Show("cambi database?", "Domanda", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign)
FileDB.ShowDialog()
If FileDB.ShowDialog() = DialogResult.OK Then
Dim SourceFile As String
SourceFile = FileDB.FileName
stringaconn = "Provider=Microsoft.JET.OLEDB.4.0;Data Source="
stringaconn = stringaconn & SourceFile
objconn = New OleDb.OleDbConnection(stringaconn)
objconn.Open()
MsgBox(SourceFile)
End If
End Sub
End Class
vorrei fare in modo di poter cambiare il db destinazione, all'apertura del programma è possibile conoscere l'ultimo db utilizzato ed eventualmente proporlo prima di effettuare l' openfiledialog?
p.s. il codice è giusto? a parte tutta una serie di message sovrabbondanti...
No. Il codice è pieno di errori, anche se come sintassi è corretto.
In particolare :
1. Non intercetti Yes/No sulla MsgBox e l'OpenFileDialog si apre sia su Yes che sul No.
2. L'OpenFileDialog si apre sempre 2 volte. Bisogna dare Annulla 2 volte per chiuderla.
3. l'OpenFileDialog non ha un filtro opportuno ( proprietà .Filter ), che nel tuo caso dovrebbe permettere di scegliere solo file .mdb.
Mentre posso aprire un file qualsiasi, ad es. un .pdf e ovviamente alla Cn.Open() si incarta.
Direi che prima di pensare a come tenere traccia dell'ultimo Db usato ( io serializzerei un'apposita classe "impostazioni" su file xml... ), hai ancora del lavoro da fare... ;)
radeon_snorky
25-02-2009, 11:19
No. Il codice è pieno di errori, anche se come sintassi è corretto.beh, si! me ne ero accorto... è che in ufficio avevo un poco di tempo e mi sono messo a pasticciare un pò.
poi ora, a casa, si è aggiunta la signora che appena mi vede davanti al pc s'incacchia... mi sa che per finire il programma mi ci vorranno secoli...
domanda:
ho provato ad inserire il codice "corretto" (spero...) nel precedente programma e funziona! o meglio, la connessione la apre effettivamente, ma poi tutto il resto del programma punta sempre al db "vecchio"... credo che sia normale, giusto? beh, c'è un modo, una via di mezzo, tra lo scrivere tutto il codice e farsi aiutare dal drag&drop di vb.net???? comunque se ne riparlerà nel fine settimana! ah... GRAZIE 1000 di tutto l'aiuto che mi stai dando!
Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim objconn As OleDb.OleDbConnection
Dim stringaconn As String
Dim FileDB As New OpenFileDialog()
Select Case MessageBox.Show("cambi database?", "Domanda", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign)
Case DialogResult.No
Dim SourceFile As String
SourceFile = "\\Server\pippo\pluto\paperino\pratiche.mdb"
stringaconn = "Provider=Microsoft.JET.OLEDB.4.0;Data Source="
stringaconn = stringaconn & SourceFile
objconn = New OleDb.OleDbConnection(stringaconn)
objconn.Open()
Exit Sub
Case DialogResult.Yes
FileDB.ShowDialog()
If DialogResult.OK Then
Dim SourceFile As String
SourceFile = FileDB.FileName
stringaconn = "Provider=Microsoft.JET.OLEDB.4.0;Data Source="
stringaconn = stringaconn & SourceFile
objconn = New OleDb.OleDbConnection(stringaconn)
objconn.Open()
MsgBox(SourceFile)
Exit Sub
End If
If DialogResult.No Then
Exit Sub
End If
End Select
End Sub
domanda:
ho provato ad inserire il codice "corretto" (spero...) nel precedente programma e funziona! o meglio, la connessione la apre effettivamente, ma poi tutto il resto del programma punta sempre al db "vecchio"... credo che sia normale, giusto? beh, c'è un modo, una via di mezzo, tra lo scrivere tutto il codice e farsi aiutare dal drag&drop di vb.net????
Punta al Db vecchio perchè la stringa di connessione la crei da zero in ogni punto in cui la usi. Se vuoi che in ogni routine venga usata sempre la stessa, basta inserirla in una unica variabile Public in un modulo.
"Vie di mezzo" ce ne sono parecchie ma sono più un punto di arrivo, non di partenza. Ado .Net è davvero grosso, e ogni giorno ci trovo cose nuove che non conoscevo... Insomma il mio consiglio è sempre lo stesso : all'inizio fai fatica e scrivi codice.
E cmq, come regola generale, le cose che puoi fare con le procedure facilitate sono solo una minima parte di tutto quello che puoi ottenere scrivendo...
radeon_snorky
26-02-2009, 10:30
Punta al Db vecchio perchè la stringa di connessione la crei da zero in ogni punto in cui la usi. Se vuoi che in ogni routine venga usata sempre la stessa, basta inserirla in una unica variabile Public in un modulo.
"Vie di mezzo" ce ne sono parecchie ma sono più un punto di arrivo, non di partenza. Ado .Net è davvero grosso, e ogni giorno ci trovo cose nuove che non conoscevo... Insomma il mio consiglio è sempre lo stesso : all'inizio fai fatica e scrivi codice.
E cmq, come regola generale, le cose che puoi fare con le procedure facilitate sono solo una minima parte di tutto quello che puoi ottenere scrivendo...eheheh me ne sto accorgendo!
un solo appunto: ho preso da msdn (per non sbagliare nemmeno di una virgola) il codice per filtrare la openfiledialog, MA VISUALIZZA SEMPRE TUTTI I FILE!!! (infatti rimane in bianco la casella "tipo file...") uffaaaaaa grrrrrrrrrr
eheheh me ne sto accorgendo!
un solo appunto: ho preso da msdn (per non sbagliare nemmeno di una virgola) il codice per filtrare la openfiledialog, MA VISUALIZZA SEMPRE TUTTI I FILE!!! (infatti rimane in bianco la casella "tipo file...") uffaaaaaa grrrrrrrrrr
alla proprieta filter devi assegnargli una stringa formattata in questo modo:
descrizione file | *.estensione file
nel tuo caso suppongo vada bene questo
FileDb.Filter = "database (.mdb) | *.mdb "
la parte che conta e cioe cio ke filtra è quella dopo il simbolo "|" il resto lo puoi cambiare come vuoi......
radeon_snorky
26-02-2009, 13:19
alla proprieta filter devi assegnargli una stringa formattata in questo modo:
descrizione file | *.estensione file
nel tuo caso suppongo vada bene questo
FileDb.Filter = "database (.mdb) | *.mdb "
la parte che conta e cioe cio ke filtra è quella dopo il simbolo "|" il resto lo puoi cambiare come vuoi......si, come detto sono andato su msdn per non sbagliare! eppure non funziona!
Il filtro è corretto, ma non è l'unica cosa da considerare.
Bisogna anche dichiarare e usare l'OpenFileDialog nel modo giusto.
Questo ad esempio...:
Dim nomeFileCompl As String
Dim OFD As New OpenFileDialog
OFD.Filter = "File Access .mdb | *.mdb"
OFD.FilterIndex = 1
OFD.Title = "Seleziona il DB Access da utilizzare :"
DialogResult = OFD.ShowDialog
If DialogResult = DialogResult.OK Then
nomeFileCompl = OFD.FileName
MsgBox(nomeFileCompl)
End If
OFD.Dispose()
;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.