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 - CustomControl con proprietà Text non di tipo string
Forum - C# / VB.NET - CustomControl con proprietà Text non di tipo string

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


Messaggi: 4
Iscritto: 28/01/2013

Segnala al moderatore
Postato alle 7:27
Sabato, 20/06/2020
Salve a tutti.
Ho la necessità di creare in VB.net o C# un UserControl personalizzato che abbia una proprietà chiamata Text di tipo NON string.

Es.

Codice sorgente - presumibilmente VB.NET

  1. Public Class MyControl
  2.  
  3.    Private pText As MyTextClass
  4.    Public Shadows Property Text As MyTextClass
  5.        Get
  6.           Return pText
  7.        End Get
  8.        Set(ByVal Value As MyTextClass)
  9.           pText = value
  10.        End Set
  11.   End Property
  12. End Class
  13.  
  14. Public Class MyTextClass
  15.     Public Shared Widening Operator CType(ByVal value As String) As MyTextClass
  16.         Return New MyTextClass(value)
  17.     End Operator
  18.  
  19.     Public Shared Widening Operator CType(ByVal value As MyTextClass) As String
  20.        Return value.Text
  21.     End Operator
  22.  
  23.     Private _text As String = ""
  24.     Public Property MyText As String
  25.         Get
  26.             Return _text
  27.         End Get
  28.         Set(value As String)
  29.             _text = value
  30.         End Set
  31.     End Property
  32.  
  33.     Private _Forecolor As System.Drawing.Color = Nothing
  34.     Public Property Forecolor() As System.Drawing.Color
  35.         Get
  36.             Return _Forecolor
  37.         End Get
  38.         Set(value As System.Drawing.Color)
  39.             _Forecolor = value
  40.         End Set
  41.     End Property
  42. End Class



Il controllo funzionerebbe bene se non al momento della creazione a designtime.
Quando viene aggiunto al form, ricevo questo errore :
"Un oggetto di tipo 'System.String' non può essere convertito nel tipo 'MyTextClass'"

Se cambio il nome della proprietà (ex. TextEx) tutto funziona alla perfezione


Ultima modifica effettuata da Thejuster il 03/07/2020 alle 12:18
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6066
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:14
Sabato, 20/06/2020
Che vuol dire "non string"? Di che tipo deve essere?


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
selemaco (Normal User)
Newbie


Messaggi: 4
Iscritto: 28/01/2013

Segnala al moderatore
Postato alle 12:41
Sabato, 20/06/2020
Ciao. Innanzitutto grazie per l'interessamento.

Deve essere di tipo MyTextClass, ovvero una custom class che a sua volta ha diverse proprietà.

Codice sorgente - presumibilmente VB.NET

  1. Private pText As MyTextClass
  2.  
  3. Public Shadows Property Text As MyTextClass
  4.        Get
  5.           Return pText
  6.        End Get
  7.        Set(ByVal Value As MyTextClass)
  8.           pText = value
  9.        End Set
  10. End Property


Ultima modifica effettuata da Thejuster il 03/07/2020 alle 12:18
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 645
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 13:38
Sabato, 20/06/2020
Non puoi usare la proprietà Text, perché Text è usato dal linguaggio e si creano delle ambiguità.
Non ricevi errori perche hai dichiarato Text come Shadows:
Codice sorgente - presumibilmente C# / VB.NET

  1. Public Shadows Property Text As MyTextClass



Se togli Shadow vedrai che ti viene sconsigliato di usare Text

Se Textex non ti piace usa Testo.

Se proprio vuoi usare Text, aggiungi l'UserControl da codice, invece che da progettazione, vedrai che funzionerà.

Codice sorgente - presumibilmente VB.NET

  1. Dim UC_Text As New MyControl
  2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  3.     Me.Controls.Add(UC_Text)
  4. End Sub



Se dovrai usarne più di uno dovrai dichiarare una lista di MyControl

Ultima modifica effettuata da Carlo il 20/06/2020 alle 14:46


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


Messaggi: 4
Iscritto: 28/01/2013

Segnala al moderatore
Postato alle 13:53
Sabato, 20/06/2020
Hai confermato ciò che supponevo..

Grazie 1000

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 645
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 21:54
Domenica, 21/06/2020
Per risolvere il problema del conflitto dei nomi, devi inserire un namespace, che renda la tua proprietà Text, legata ad un namespace diverso da quello "standard" System.Text

Codice sorgente - presumibilmente VB.NET

  1. Namespace Controlli
  2.  
  3.     Public Class MyControl
  4.  
  5.         Private pText As MyTextClass
  6.         Public Property Text As MyTextClass
  7.             Get
  8.                 Return pText
  9.             End Get
  10.             Set(ByVal Value As MyTextClass)
  11.                 pText = value
  12.             End Set
  13.         End Property
  14.  
  15.     End Class
  16.  
  17. End Namespace


Ultima modifica effettuata da Carlo il 25/06/2020 alle 11:07


in programmazione tutto è permesso
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 1999
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 11:25
Giovedì, 02/07/2020
Non è detto carlo.

C'è la possibilità di vare  un override di una proprietà e sfruttarla a proprio piacimento.

io programmo in C# quindi vi faccio l'esempio in C#.

Codice sorgente - presumibilmente VB.NET

  1. class MioControllo : Control
  2. {
  3.  
  4. private string tx;
  5.  
  6. public ovveride string Text
  7. {
  8.      get { return tx; }
  9.      set
  10.      {
  11.         tx = value;
  12.         //Altre operazioni
  13.       }
  14.  
  15. }
  16.  
  17.  
  18. }



Al blocco set puoi impostare ulteriori funzionamenti come settare ad un'altra variabile il valore stesso contenuto in value


ma se si tratta di disegnare semplicemente del testo con un ombra una sola proprietà Text và piu che bene.
Devi solo modificare il paint e spostare di qualche pixel il testo superiore rispetto a quello inferiore di qualche pixel.

Ad esempio questa è una mia skin fatta in c# e GDI puoi vedere un piccolo esempio.

https://i.ibb.co/DbfzxJX/Immagine.png


PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 645
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 22:01
Giovedì, 02/07/2020
Con override non ho provato, proverò, grazie Thejuster.
selemaco aveva messo Shadow, e funziona, il problema sorge solo se si vuole inserire l'usercontrol da progettazione.

Ultima modifica effettuata da Carlo il 02/07/2020 alle 22:14


in programmazione tutto è permesso
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 1999
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 22:16
Giovedì, 02/07/2020
si, basta semplicemente rendere la proprietà pubblica.

nel mio caso, faccio in questo modo

Codice sorgente - presumibilmente C# / VB.NET

  1. [Browsable(true),Description("Descrizione"),Category("Settings")]
  2. public ovveride string Text { ..... }



PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo