Est-il possible de désactiver le curseur dans la zone de texte sans définir la propriété Enable sur false? J'essayais d'utiliser la propriété ReadOnly, mais malgré le fait que je ne puisse pas écrire dans la zone de texte, le curseur apparaît si je clique dessus. Alors, y a-t-il un moyen de se débarrasser de ce curseur de façon permanente?
En C #, vous pouvez utiliser la zone de texte suivante en lecture seule:
public class ReadOnlyTextBox : TextBox
{
[DllImport("user32.dll")]
static extern bool HideCaret(IntPtr hWnd);
public ReadOnlyTextBox()
{
this.ReadOnly = true;
this.BackColor = Color.White;
this.GotFocus += TextBoxGotFocus;
this.Cursor = Cursors.Arrow; // mouse cursor like in other controls
}
private void TextBoxGotFocus(object sender, EventArgs args)
{
HideCaret(this.Handle);
}
}
Vous pouvez utiliser un Label
à la place. Dans le concepteur, vous définissez BorderStyle = Fixed3D
, BackColor = Window
et AutoSize = False
.
Toutefois, le curseur dans une zone de texte est fourni afin que l'utilisateur puisse faire défiler le texte plus long que la zone. Vous perdrez cette fonctionnalité avec une étiquette, à moins que vous ne soyez sûr que cela ira toujours. Sinon, il n'est pas possible de supprimer le curseur d'une zone de texte.
En C #, vous pouvez désactiver le curseur dans une zone de texte en le désactivant temporairement, puis en l'activant à chaque fois qu'il reçoit le focus. Notez qu'il n'est pas nécessaire de faire en sorte que la zone de texte soit lue uniquement si vous utilisez cette méthode. Par exemple:
private void TextBox_Enter(object sender, EventArgs e)
{
TextBox.Enabled = false;
TextBox.Enabled = true;
}
si vous mettez la fonction hideCaret dans l'événement Textchange, le problème sera résolu.
[DllImport("user32.dll")]
static extern bool HideCaret(IntPtr hWnd);
private void textBox1_TextChanged(object sender, EventArgs e)
{
HideCaret(textBox1.Handle);
}
Comme la solution de @Mikhail Semenov, vous pouvez également utiliser lambda express pour désactiver rapidement le curseur si vous ne disposez pas de nombreux champs de texte:
[DllImport("user32.dll")]
static extern bool HideCaret(IntPtr hWnd);
textBox1.ReadOnly = true;
textBox1.BackColor = Color.White;
textBox1.GotFocus += (s1, e1) => { HideCaret(textBox1.Handle); };
textBox1.Cursor = Cursors.Arrow;
La solution la plus simple pour moi consistait simplement à ignorer l'événement on focus et à revenir au parent. Cela empêche le curseur et toute édition de la zone de texte par l'utilisateur et désactive fondamentalement la zone de texte sans avoir à définir la propriété Enabled = false.
private void Form1_load(object sender, EventArgs e) {
textBox1.ReadOnly = true;
textBox1.Cursor = Cursors.Arrow;
textBox1.GotFocus += textBox1_GotFocus;
}
private void textBox1_GotFocus(object sender, EventArgs e) {
((TextBox)sender).Parent.Focus();
}
Vous pouvez le définir par programme.
textBox1.Cursor = Cursors.Arrow;
Ce n'est pas strictement une réponse à la question, mais peut-être que cela peut résoudre des problèmes similaires. J'utilise un contrôle de zone de texte qui peut ressembler à une étiquette pour un contrôle qui affiche une échelle, mais peut être édité, lorsque vous cliquez dessus. Start enabled = false et effectuez une activation (enabled = true) dans un gestionnaire de souris du contrôle parent de la zone de texte (qui, lorsqu'il est désactivé, border None et backcolor = parent backcolor ressemble à une étiquette). Par exemple. Lorsque vous entrez un hit ou un autre événement, désactivez-le à nouveau dans le gestionnaire KeyDown . par tabulation, un peu plus de travail est nécessaire (par rapport à ce que j’ai fait) . J'utilise le constructeur de formulaire pour rechercher le parent de zone de texte au moment de l’exécution et pour appliquer le contrôle de souris délégué. Peut-être que vous pouvez le faire comme bonjour au moment de la compilation (en-tête de formulaire), mais cela me semblait un peu sujette aux erreurs.