Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Inserire Nome dentro una richtebox
Forum - C# / VB.NET - Inserire Nome dentro una richtebox

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
aragorn76 (Normal User)
Newbie


Messaggi: 6
Iscritto: 10/04/2014

Segnala al moderatore
Postato alle 17:21
Martedì, 05/05/2020
Salve a tutti,
eccomi tornato con nuovo quesito molto interessante, a cui non riesco ancora a trovare soluzione. (linguaggio VB Net)

Premesso:
ho un database mysql e una richtextbox1.. Ogni carattere che io digito nella richtextbox1, viene inserito anche nella tabella TESTO di mysql.. giustamente facendo i dovuti controlli, per evitare che caratteri non validi, mi diano errori nel momento dell'inserimento nel DB.. perche? se ne va la luce, non ho perso nulla.. funziona? beh si.. :)

Problema:
in questa richtextbox, qualora l'utente inserisca un Nome, vorrei trovare un modo affinchè venga riconosciuto e in tal caso, aggiungerlo nella tabella NOMI ad esempio (oltre nella tabella TESTO che gia fa).. Ho trovato quindi il comando Like e lo vorrei usare, ma in questo modo non va:

Codice sorgente - presumibilmente VB.NET

  1. Dim sMatch As String = RichTextBox1.Find(RichTextBox1.Text Like "\\[A-Z]*")
  2.  If sMatch <> "" Then
  3.          MsgBox("il nome e: " & sMatch)
  4.  End If



\\[A-Z]* questo significa che appena metto  \\  seguito da una lettera grande, deve sapere che è un nome.. In effetti appena scrivo   \\F   appare sottolineato, come che sappia che quella parola deve indicare qualcosa.. ma al comando msgbox mi appare: il nome e: -1

Come posso risolvere? tenendo conto che ci possono essere piu nomi/cognomi dentro la RichTextBox1, quindi dovrebbe fare un controllo costante.. mi servirebbe un aiutino, anche utilizzando altre tecniche, invece del LIKE. Grazie :)

p.s. soluzioni del tipo di creare a priori una tabella con lista nomi, non è fattibile..  ;)

Ultima modifica effettuata da aragorn76 il 05/05/2020 alle 17:48
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6060
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:34
Martedì, 05/05/2020
Non ci ho capito nulla.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 1997
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:57
Mercoledì, 06/05/2020
Oltre all'idea che mi sembra veramente pessima da fare, con quel sistema difficilmente funzionerà.

per verificare se in una stringa c'è una lettera maiuscola basta fare ad esempio

Codice sorgente - presumibilmente VB.NET

  1. Dim st As String = "Paolo è un amico"
  2.  
  3. Dim val = st.Any(Function(x) Char.IsUpper(x))



Ora ponendo invece che hai

\\Paolo è un amico

ma essendoci le doppie barre \\
devi fare un controllo riga per riga se è presente \\
in seguito fare split degli spazi vuoti e cercare il campo nell'array dov'è contenuta la stringa con \\
con un substring elimini i primi 2 caratteri ovvero \\ per ottenere così solo il nome.




PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 601
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 17:38
Mercoledì, 06/05/2020
Mi associo a Thejuster, e non conosco l'istruzione Like.
Per fare quello che vuoi tu puoi decidere di scrivere il nome tra dei \\separatori\\

Prova con questo codice, ogni parola sritta tra \\parola\\, viene aggiunta ad una listbox.
nel form ci devono essere una RichTextBox1 e una ListBox1

Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2. Dim pos1 As Integer = 0
  3. Dim pos2 As Integer = 0
  4.  
  5.     Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
  6.  
  7.         If pos1 > RichTextBox1.TextLength Then pos1 = RichTextBox1.TextLength : pos2 = 0
  8.         Dim pos As Integer = RichTextBox1.Text.IndexOf("\\", pos1)
  9.  
  10.         If pos <> -1 Then
  11.             pos1 = pos + 2
  12.             If pos2 > 0 Then
  13.                 ListBox1.Items.Add(RichTextBox1.Text.Substring(pos2, RichTextBox1.TextLength - pos2 - 2))
  14.                 pos2 = 0
  15.             Else
  16.                 pos2 = pos + 2
  17.             End If
  18.         End If
  19.  
  20.     End Sub
  21. End Class



dovrai gestire effetti indesiderati, per esempio se torni indietro sul testo e aggiungi/togli parole o spazi le variabili pos1 e pos2 non saranno più corrette.

Ultima modifica effettuata da Carlo il 06/05/2020 alle 17:53


in programmazione tutto è permesso
PM Quote
Avatar
aragorn76 (Normal User)
Newbie


Messaggi: 6
Iscritto: 10/04/2014

Segnala al moderatore
Postato alle 19:48
Mercoledì, 06/05/2020
Ciao,
allora intanto grazie per la risposta..

ecco come ho risolto per il momento:


Codice sorgente - presumibilmente VB.NET

  1. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
  2.             'verifichiamo se stiamo inserendo un nome con $
  3.             Dim testArray() As String = Split(RichTextBox1.Text)
  4.             Dim lastNonEmpty As Integer = -1
  5.             For i As Integer = 0 To testArray.Length - 1
  6.                 If testArray(i) <> "" Then
  7.                     lastNonEmpty += 1
  8.                     testArray(lastNonEmpty) = testArray(i)
  9.                 End If
  10.             Next
  11.             ReDim Preserve testArray(lastNonEmpty)
  12.  
  13.             ' adesso mi prendo tutti i nomi, rimuovendo le \\
  14.             Dim val As Boolean
  15.             For i As Integer = 0 To testArray.Length - 1
  16.                 val = testArray(i) Like "\\[A-Z]*"
  17.                 If val = True Then
  18.                     'qui inserisco solo i nomi in altra tabella
  19.                     MsgBox("il nome è: " & UCase(Replace(testArray(i), "\\", "")))
  20.                 End If
  21.             Next
  22.         End Sub



in questo caso mi da tutti i nomi presenti nella richtextbox1.. Speriamo che non rallenti nel caso vi siano, che so, 200 parole.... adesso lo testp e se ho problemi vi farò sapere.. Graziee

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 601
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 9:52
Giovedì, 07/05/2020
Testo quotato

Postato originariamente da aragorn76:

in questo caso mi da tutti i nomi presenti nella richtextbox1.. Speriamo che non rallenti nel caso vi siano, che so, 200 parole.... adesso lo testp e se ho problemi vi farò sapere.. Graziee



con 200 parole non avrai problemi, lo stesso codice lo puoi scrivere così, per aumentarne un po' l'efficienza:

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  2.  
  3.         ' tutte le parole separate da spazio in testArray
  4.         Dim testArray() As String = Split(RichTextBox1.Text, " ")
  5.  
  6.         ' controllo tutte le parole
  7.         For i As Integer = 0 To testArray.Length - 1
  8.             If testArray(i) <> "" And testArray(i) Like "\\[A-Z]*" Then
  9.                 'qui inserisco solo i nomi in altra tabella
  10.                 MsgBox("il nome è: " & UCase(Replace(testArray(i), "\\", "")))
  11.             End If
  12.         Next
  13.  
  14. End Sub



Hai anche cambiato il concetto della routine, eri partito che la cosa doveva avvenire mentre digitavi, per non perdere il lavoro se mancasse la corrente, invece ora hai inserito un button.
Grazie per avermi portato a conoscenza dell'istruzione Like.

Ultima modifica effettuata da Carlo il 07/05/2020 alle 9:59


in programmazione tutto è permesso
PM Quote
Avatar
aragorn76 (Normal User)
Newbie


Messaggi: 6
Iscritto: 10/04/2014

Segnala al moderatore
Postato alle 13:24
Giovedì, 07/05/2020
Testo quotato

Postato originariamente da Carlo:
Hai anche cambiato il concetto della routine, eri partito che la cosa doveva avvenire mentre digitavi, per non perdere il lavoro se mancasse la corrente, invece ora hai inserito un button.
Grazie per avermi portato a conoscenza dell'istruzione Like.



Si questo è un pulsante creato per prova... con la sub RichTextBox1_TextChanged comunque ad ogni cambiamento, mi salva il contenuto in una tabella :) ho provato il tuo codice e funziona alla grande, ma mi sono accorto di un altra cosa :)

Non capivo perchè se scrivevo \\Fabio   veniva sottolineato.. ma se usavo $Fabio (invece delle \\) no.... alla fine ci sono arrivato.. veniva sottolineato perchè lo vede come un hiperlink.. quindi invece del button, potrei usare il click sul link per inserire il nome nella tabella :)

Adesso il problema è all'inverso..... Quindi adesso mi ritrovo (dopo il salvataggio) del testo \\Fabio e \\Gino
nella tabella nomi tutto ok invece.. perche per ogni nome mi crea un record nuovo..

nella tabella "descrizione":   \\Fabio e \\Gino    (quindi un unico link... quando invece dovrebbe separarli come in origine \\Fabio e \\Gino e quindi non so se posso usare \\ a questo punto.... avete soluzione per farli vedere come 2 link separati?

Se riesco, dato che oltre ai nomi vi sarà pure tabella delle città.. vorrei usare sempre \\ dove cliccando si apre una form con due pulsanti "Nomi" e "Città" per far capire che si sta inserendo un nome o una città.. ma questo lo vedo dopo che risolvo questa parte.
Se avete idee o suggerimenti sono Graditi :)

Certo che se vi era una soluzione che appena uno metteva che so $Milano, sapeva subito col $ che è una città e la mette in automatico nella tabella città senza cliccare nulla.... era meglio, piu professionale e meno click per l'operatore che scrive :(  
Grazie

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 601
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 15:22
Giovedì, 07/05/2020
Sta alla tua fantasia e a come vuoi che l'utente operi, se vuoi persegire l'approcio che un utente scrive nella RichTextBox e quando viene digitata la combinazione "magica" (\\) accade qualcosa, potresti far apparire un nuovo form di input.

Per esempio così:
inserire una RichTextBox1 e una ListBox1 su Form1
Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.     Dim pos1 As Integer = 0
  3.     Dim FormInput As New Form
  4.     Dim TextInput As New TextBox
  5.     Dim Accoda As New Button
  6.     Dim Fatto As New Button
  7.     Dim Scelta(3) As RadioButton
  8.  
  9.     Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
  10.  
  11.         If pos1 > RichTextBox1.TextLength Then pos1 = RichTextBox1.TextLength
  12.         Dim pos As Integer = RichTextBox1.Text.IndexOf("\\", pos1)
  13.         If pos <> -1 Then pos1 = pos + 2 : FormInput.Show()
  14.  
  15.     End Sub
  16.  
  17.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  18.         ' preparazione form di input
  19.         ' meglio fare in progettazione complesso quanto vuoi
  20.         FormInput.Text = "Scegli il tipo di record"
  21.         FormInput.Size = New Size(300, 180)
  22.  
  23.         ' preparazione text su form di input
  24.         TextInput.Location = New Point(10, 10)
  25.         TextInput.Size = New Point(260, 20)
  26.         FormInput.Controls.Add(TextInput)
  27.  
  28.         ' preparazione button su form di input
  29.         Accoda.Text = "Accoda"
  30.         Accoda.Location = New Point(150, 80)
  31.         FormInput.Controls.Add(Accoda)
  32.         AddHandler Accoda.Click, AddressOf Accoda_OnClick ' permette di avere l'evento click
  33.  
  34.         ' preparazione button su form di input
  35.         Fatto.Text = "Fatto"
  36.         Fatto.Location = New Point(150, 110)
  37.         FormInput.Controls.Add(Fatto)
  38.         AddHandler Fatto.Click, AddressOf Fatto_OnClick ' permette di avere l'evento click
  39.  
  40.         ' preparazione radiobutton su form di input
  41.         For i = 0 To 3
  42.             Scelta(i) = New RadioButton
  43.             Scelta(i).Location = New Point(10, 24 * i + 40)
  44.             FormInput.Controls.Add(Scelta(i))
  45.         Next
  46.         Scelta(0).Checked = True
  47.         Scelta(0).Text = "Nome "
  48.         Scelta(1).Text = "Cognome "
  49.         Scelta(2).Text = "Città "
  50.         Scelta(3).Text = "Tel. "
  51.  
  52.     End Sub
  53.  
  54.     Private Sub Accoda_OnClick(sender As Object, e As EventArgs)
  55.         For i = 0 To 3
  56.             If Scelta(i).Checked Then
  57.                 ListBox1.Items.Add(Scelta(i).Text & TextInput.Text)
  58.                 RichTextBox1.Text = Replace(RichTextBox1.Text, "\\", "")
  59.                 RichTextBox1.Text = RichTextBox1.Text & Scelta(i).Text & TextInput.Text & " "
  60.             End If
  61.         Next
  62.     End Sub
  63.  
  64.     Private Sub Fatto_OnClick(sender As Object, e As EventArgs)
  65.         FormInput.Hide()
  66.         RichTextBox1.Text = Replace(RichTextBox1.Text, "\\", "")
  67.     End Sub
  68.  
  69. End Class



Per renderlo funzionale ai tuoi scopi ci devi mettere del tuo.

Ultima modifica effettuata da Carlo il 07/05/2020 alle 15:39


in programmazione tutto è permesso
PM Quote
Avatar
aragorn76 (Normal User)
Newbie


Messaggi: 6
Iscritto: 10/04/2014

Segnala al moderatore
Postato alle 11:07
Mercoledì, 20/05/2020
Eccomi son tornato... alla fine ho cambiato metodo perchè con le doppie \ mi segnava come hyperlink (e quindi cliccabile) ma nel metterlo in un db mysql e poi riprendere la stringa, mi faceva diventare tutto come un unico link... quindi ho ovviato con il colore, sfruttando la tua idea e trovando uno script carino :)



Codice sorgente - presumibilmente C#

  1. ' preparazione form di input
  2.                ' meglio fare in progettazione complesso quanto vuoi
  3.                 Formdentro.Text = "Inserisci"
  4.                 Formdentro.Size = New Size(200, 180)
  5.                 Formdentro.ControlBox = False
  6.                 Formdentro.Location = New Point(20000, 15000)
  7.  
  8.                 ' preparazione text su form di input
  9.                TextInput.Location = New Point(10, 10)
  10.                TextInput.Size = New Point(150, 20)
  11.                TextInput.CharacterCasing = CharacterCasing.Upper
  12.                Formdentro.Controls.Add(TextInput)
  13.  
  14.                ' preparazione button su form di input
  15.                 Inserisci.Text = "Inserisci"
  16.                 Inserisci.Location = New Point(100, 80)
  17.                 Inserisci.TabIndex = 3
  18.                 Formdentro.Controls.Add(Inserisci)
  19.                 AddHandler Inserisci.Click, AddressOf Inserisci_OnClick ' permette di avere l'evento click
  20.  
  21.                 ' preparazione button su form di input
  22.                Annulla.Text = "Annulla"
  23.                Annulla.Location = New Point(100, 110)
  24.                Annulla.TabIndex = 3
  25.                Formdentro.Controls.Add(Annulla)
  26.                AddHandler Annulla.Click, AddressOf Annulla_OnClick ' permette di annullare
  27.  
  28.  
  29.                 ' preparazione radiobutton su form di input
  30.                For i = 0 To 1
  31.                    Scelta(i) = New RadioButton
  32.                    Scelta(i).Location = New Point(10, 24 * i + 40)
  33.                    Formdentro.Controls.Add(Scelta(i))
  34.                Next
  35.                Scelta(0).Checked = True
  36.                Scelta(0).Text = "Nome "
  37.                Scelta(0).TabIndex = 1
  38.                Scelta(1).Text = "Cognome "
  39.                Scelta(1).TabIndex = 2




Codice sorgente - presumibilmente VB.NET

  1. Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
  2.  
  3.         If pos1 > RichTextBox1.TextLength Then pos1 = RichTextBox1.TextLength
  4.         Dim pos As Integer = RichTextBox1.Text.IndexOf("<", pos1)
  5.         If pos <> -1 Then pos1 = pos + 2 : FormInput.Show()
  6.  
  7.     End Sub




Codice sorgente - presumibilmente VB.NET

  1. Private Sub Inserisci_OnClick(sender As Object, e As EventArgs)
  2.             If Scelta(0).Checked = True Then
  3.                 RichTextBox1.Text = RichTextBox1.Text & TextInput.Text & "> "
  4.             Else
  5.                 RichTextBox1.Text = RichTextBox1.Text & TextInput.Text & "| "
  6.             End If
  7.             TextInput.Text = ""
  8.             Formdentro.Hide()
  9.             RichTextBox1.Focus()
  10.  
  11.             '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  12.             'codice per il colore
  13.             Dim SearchTerm As String = "<"
  14.             Dim ResultIndex As Integer = Nothing
  15.             Dim SearchStartIndex As Integer = 0
  16.             'Loop until the searchword is not found in the RichTextBox
  17.             Do Until ResultIndex = -1
  18.                 'Progressive search (search from the end of the last result)
  19.                 ResultIndex = RichTextBox1.Text.IndexOf(SearchTerm, SearchStartIndex)
  20.                 'If the searchstring was not found then cancel the routine
  21.                 If ResultIndex = -1 Then Exit Do
  22.  
  23.                 'Get the line the matched string occurs on (narrows things down a bit)
  24.                 Dim ResultLine As Integer = RichTextBox1.GetLineFromCharIndex(ResultIndex)
  25.                 Dim ResultLineStart As Integer = RichTextBox1.GetFirstCharIndexFromLine(ResultLine)
  26.                 Dim GetWordStart As Integer = ResultLineStart
  27.  
  28.                 'Loop backwards from the Index where the match begins to the beginning of the line
  29.                 For i As Integer = ResultIndex To ResultLineStart Step -1
  30.                     'Record the position following a space (" ").
  31.                     If RichTextBox1.Text.Chars(i) = " " Then
  32.                         GetWordStart = i + 1
  33.                         Exit For
  34.                     End If
  35.                 Next i
  36.                 'Loop through and find the end of the current Word (index before the next space in the line)
  37.                 Dim GetWordEnd As Integer = RichTextBox1.TextLength - 1
  38.                 For i As Integer = ResultIndex To GetWordEnd
  39.                     If RichTextBox1.Text.Chars(i) = " " Then
  40.                         GetWordEnd = i
  41.                         Exit For
  42.                     End If
  43.                 Next
  44.  
  45.                 'This is the Full 'word' that contains the searchstring
  46.                 Dim GetFullWord As String = RichTextBox1.Text.Substring(GetWordStart, GetWordEnd - GetWordStart).Trim
  47.                 'If it starts with a link syntax then select and highlight the text
  48.                 If GetFullWord.EndsWith(">") Then
  49.                     RichTextBox1.Select(GetWordStart, GetWordEnd - GetWordStart)
  50.                     RichTextBox1.SelectionColor = Color.LightBlue
  51.                     RichTextBox1.Select(RichTextBox1.TextLength, 0)
  52.                 End If
  53.                 If GetFullWord.EndsWith("|") Then
  54.                     RichTextBox1.Select(GetWordStart, GetWordEnd - GetWordStart)
  55.                     RichTextBox1.SelectionColor = Color.LightCoral
  56.                     RichTextBox1.Select(RichTextBox1.TextLength, 0)
  57.                 End If
  58.  
  59.                 'Update the start index for the search to begin from on the next pass, or cancel further searches if we are at the end of the string
  60.                 If GetWordEnd = RichTextBox1.TextLength - 1 Then Exit Do Else SearchStartIndex = ResultIndex + 1
  61.             Loop
  62.         End Sub



cosi facendo, appena si digita < nella richtextbox si apre il form e in base alla scelta, fa terminare la parola con altro segno che viene riconosciuto e poi vi è il controllo il ciclo do until, loop che colora... tutto funziona.. cosi facendo i nomi risultano blu e cognomi rossi.. poi mi prendo i valori pulendo la richtextbox dai caratteri < > e |.....

adesso il poblema è... se tali nomi li ho inseriti in una tabella e quando riprendo i valori mi accorgo che un nome è sbagliato.. vorrei cliccarci sopra per modificarlo.. ma non so se possibile cliccare su una parola colorata e in base al colore prendere il valore, in modo che poi lo modifico anche nella tabella nomi... adesso vedo ma se avete idee o metodo che potrei usare, li accetto volentieri :)

Ultima modifica effettuata da aragorn76 il 20/05/2020 alle 11:08
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo