Autore Topic: [Risolto] tableview  (Letto 810 volte)

Offline naderit

  • Grande Gambero
  • ***
  • Post: 140
    • Mostra profilo
[Risolto] tableview
« il: 20 Giugno 2021, 20:54:57 »
Ciao a tutti, ho fatto diverse ma ricerche senza risultato, la domanda : è possibile fare in modo che che le celle di una di una determinata colonna di una tableview accetti solo numeri e altre celle di un'altra colonna venga editato solo in maiuscolo?.
con la textbox utilizzando l'evento keypress e change è possibile fare questo, ma con la tableview non sono riuscito a risolvere nulla.
 :ciao:   
« Ultima modifica: 22 Giugno 2021, 20:46:22 da naderit »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:tableview
« Risposta #1 il: 20 Giugno 2021, 22:08:21 »
...più o meno una cosa così ?

Codice: [Seleziona]
Public Sub Form_Open()

  With TableView1
    .Rows.Count = 3
    .Columns.Count = 2
  End With

End


Public Sub TableView1_KeyRelease()
 
  Select Key.Code
    Case 48 To 57
      TableView1[0, 0].Text = Chr(Key.Code)
    Case 65 To 90
      TableView1[0, 1].Text = Chr(Key.Code)
  End Select
 
End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:tableview
« Risposta #2 il: 20 Giugno 2021, 22:48:55 »
Propongo questo codice, ma forse è inutile e troppo complicato  :-\

Codice: [Seleziona]
' Gambas class file

Private hTable As TableView

Public Sub Form_Open()

  Me.Arrangement = Arrange.Fill
  Me.Margin = True
  hTable = New TableView(Me) As "TableView1"
  With hTable
    .Header = 3
    .Columns.Count = 3
    .Rows.count = 10
    .Columns[0].Text = "NORMALE"
    .Columns[1].Text = "NUMERO"
    .Columns[2].Text = "MAIUSCOLO"
  End With

End

Public Sub TableView1_Click()

  hTable.Edit

End

Public Sub TableView1_Save(Row As Integer, Column As Integer, Value As String)

  If column = 1 Then
    If Value = soloNumero(Value) Then
      hTable[row, column].text = value
      hTable[row, column].Background = Color.White
    Else
      hTable[row, column].text = ""
      hTable[row, column].Background = Color.SoftRed
    Endif
  Else If column = 2 Then
    hTable[row, column].text = string.UCase(Value)
  Else
    hTable[row, column].text = value
  Endif

End

Public Function soloNumero(value As String) As String

  Dim n As Integer
  Dim res As String = ""

  For n = 0 To Len(value) - 1
    If InStr("0123456789.-", value[n]) Then res &= value[n]
  Next
  Return IIf(res = "", "0", res)

End

Ho preso a prestito il codice di Pastrank qui:
https://www.gambas-it.org/smf/index.php?topic=8660.msg50502#msg50502

Ho variato leggermente la sub save per segnalare l'errore
« Ultima modifica: 20 Giugno 2021, 23:17:39 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:tableview
« Risposta #3 il: 20 Giugno 2021, 23:42:47 »
...
con la textbox utilizzando l'evento keypress e change è possibile fare questo, ma con la tableview non sono riuscito a risolvere nulla.
 

Dimenticavo potresti usare:
Codice: [Seleziona]
TableView1.EditWith(TextBox1)

Ora non ho tempo, scappo a dormire che domani ho delle commissioni da fare, notte
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline naderit

  • Grande Gambero
  • ***
  • Post: 140
    • Mostra profilo
Re:tableview
« Risposta #4 il: 21 Giugno 2021, 21:32:06 »
Ciao grazie per le risposte ho risolto in parte, con il codice proposto da Gianluigi sono riuscito a risolvere il maiuscolo implementando la regolazione automatica dell'altezza riga:
Codice: [Seleziona]
Public Sub TableView1_Save(Row As Integer, Column As Integer, Value As String)  
  If Column = 1 Then
  TableView1[Row, Column].Text = Upper(Value)
  Else
  TableView1[Row, Column].Text = Value 
  End If
 
  TableView1[Row, Column].WordWrap = True
  TableView1.Rows[Row].Height = -1
End

mentre con il codice di Vuott sembra che gli eventi keypress e keyrelease sulla tableview non abbiano alcun effetto.
sto cercando di implementare questa funzione:
Codice: [Seleziona]
Public Function Numeri()
'solo numeri
 If Key.Code >= 48 And Key.Code <= 57 Then
   Else If key.Code = key.BackSpace Then
   Else If key.Code = key.Delete Then
   Else If Key.Code = Key.Left Then
   Else If Key.code = Key.Right Then
   Else If Key.Code = Key.Tab Then 
    Else
      Stop Event
  End If
 End 
per la gestione dei numeri, praticamente mi dovrebbe far utilizzare solo la parte numerica e alcuni tasti. Per il momento grazie :ciao: 

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:tableview
« Risposta #5 il: 21 Giugno 2021, 22:57:51 »
Come ti avevo suggerito puoi usare editwith con una textbox:
Codice: [Seleziona]
' Gambas class file

Private hTable As TableView
Private hText As TextBox

Public Sub Form_Open()

  Me.Arrangement = Arrange.Fill
  Me.Margin = True
  hText = New TextBox(Me) As "TextBox1"
  hText.Visible = False
  hTable = New TableView(Me) As "TableView1"
  With hTable
    .Header = 3
    .Columns.Count = 3
    .Rows.count = 10
    .Columns[0].Text = "NORMALE"
    .Columns[1].Text = "NUMERO"
    .Columns[2].Text = "MAIUSCOLO"
  End With

End

Public Sub TableView1_Click()

  hTable.EditWith(hText)

End

Public Sub TableView1_Save(Row As Integer, Column As Integer, Value As String)

  hTable[row, column].text = value

End

Public Sub TextBox1_Change()

  If hTable.Column = 1 Then
    hText.Text = soloNumero(hText.Text)
  Else If hTable.Column = 2 Then
    hText.Text = String.UCase(hText.Text)
  Endif

End


Private Function soloNumero(value As String) As String

  Dim n As Integer
  Dim res As String = ""

  For n = 0 To Len(value) - 1
    If InStr("0123456789.-", value[n]) Then res &= value[n]
  Next
  Return res

End

Ti conviene usare String.Ucase e non Upper , per capire prova a scrivere città nella colonna maiuscolo.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline naderit

  • Grande Gambero
  • ***
  • Post: 140
    • Mostra profilo
Re:tableview
« Risposta #6 il: 22 Giugno 2021, 20:45:56 »
Grandioso! mi piace il codice, grazie Gianluigi, l'ho modificato in questo modo:
Codice: [Seleziona]
Private hTable As TableView
Private hText As TextBox

Public Sub Form_Open()
Me.Arrangement = Arrange.Fill
  Me.Margin = True
  hText = New TextBox(Me) As "TextBox1"
  hText.Visible = False
  hTable = New TableView(Me) As "TableView1"
  With hTable
    .Header = 3
    .Columns.Count = 3
    .Rows.count = 10
    .Columns[0].Text = "NORMALE"
    .Columns[1].Text = "NUMERO"
    .Columns[2].Text = "MAIUSCOLO"
  End With
End

Public Sub TableView1_Click()
 hTable.EditWith(hText)
End

Public Sub TableView1_Save(Row As Integer, Column As Integer, Value As String)
 hTable[row, column].text = value
hTable[Row, Column].WordWrap = True
  hTable.Rows[Row].Height = -1 'regola in automatico altezza cella
End

Public Sub TextBox1_Change()
  If hTable.column = 1 Then
   If hText.text > "" Then
    hText.text = Format(Replace(hText.Text, ",", Null) / 100, "0.00") ' virgola in automatico inserimento euro
   Endif 
  Else If hTable.Column = 2 Then
    hText.Text = String.UCase(hText.Text)
  Endif
 
End

Public Sub TextBox1_keypress()
  If hTable.Column = 1 Then
    mod_set.Numeri
  Endif
 
End
'modulo mod_set

Public Function Numeri()
'solo numeri
 If Key.Code >= 48 And Key.Code <= 57 Then
   Else If key.Code = key.BackSpace Then
   Else If key.Code = key.Delete Then
   Else If Key.Code = Key.Left Then
   Else If Key.code = Key.Right Then
   Else If Key.Code = Key.Tab Then 
    Else
      Stop Event
  End If
 End 
   
funziona egregiamente
P.s. non mi sarebbe mai venuto in mente di usare una textbox.  ;D :ciao:
« Ultima modifica: 22 Giugno 2021, 20:49:06 da naderit »