Può accadere che il TextBox generato da un Gridview durante la fase di Editing di una riga non contenga interamente il testo della cella nel database sottostante l’applicazione tagliandolo, con un effetto antiestetico.
Il problema quindi è aumentare l’ampiezza del TextBox, ovvero trasformare il TextBox da
TextBox.TextMode = TextBoxMode.SingleLine
a
TextBox.TextMode = TextBoxMode.MultiLine
Per ovviare a tutto questo ho scritto il seguente pezzo di codice
Sub GridView_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles GridView1.RowCreated
If (e.Row.RowState And DataControlRowState.Edit) > 0 Then
Dim pippo As New TextBox
pippo = DirectCast(e.Row().Cells(4).Controls(0), TextBox)
pippo.TextMode = TextBoxMode.MultiLine
End If
End Sub
Leggendo la soluzione è possibile scoprire diversi aspetti del funzionamento del nuovo Gridview
Innanzitutto è necessario capire a quale evento innescare l’esecuzione del codice;
si è tentati di pensare che l’evento relativo sia
GridView_RowEditing
ma non è così poiché, nel momento di Editing, non esiste ancora il TextBox che deve essere modificato!
L’evento giusto è quello legato alla creazione di una riga;
da qui controlleremo poi se questa riga è in fase di Editing ed ancora se è nello stato normal o alternate;
se non specifichiamo se la riga selezionata è in stato Normal o Alternate il casting del nostro TextBox avverrà solo verso le righe in stato Normal!
Non è possibile controllare lo stato della riga attraverso un ciclo If.. Else poiché i diversi stati tendono ad escludersi a vicenda in maniera misteriosa;
Alternate indica che la row è nello stato Alternate. Questo stato può combinarsi tranquillamente con lo stato Normal, Edit, oppure Insert
Edit indica che la row è nello stato Edit innescato dalla pressione del link Edit relativo alla riga stessa. Lo stato Edit e quello Insert si escludono reciprocamente
Insert indica che la row è stata generata dopo la pressione di un pulsante Insert dedicato alla creazione di una nuova riga. Lo stato Edit e quello Insert si escludono reciprocamente.
Normal indica che la riga è in uno stato normale, cioé senza alcuna modifica. Lo stato Normal esclude reciprocamente tutti gli altri.
Selected indica che la riga è stata selezionata da un’utente
Utilizzare un ciclo condizionale If.. Else per controllare lo stato di una riga nel Gridview è una trappola piuttosto comune che genera un eccezione fatale.
Per evitare strani conflitti, dopo diversi frustranti tentativi, ho scoperto che era possibile utilizzare un operatore bitwise & che effettua una scelta confrontando i singoli bit;
lo stato delle singole rows può anche essere un flag numerico quindi se il confronto tra queste, a livello di bit, è maggiore di zero effettuiamo il DirectCast della quarta cella della riga;
utilizziamo DirectCast poiché, a differenza di Ctype, funziona quando uno dei membri sui quali effettuare la conversione deve ereditare dall'altro o implementarlo.