JacoBosch Ответов: 5

Как изменить forecolor текста, когда textbox доступен только для чтения


Хороший день

Я сделал свои текстовые поля reaadonly, и я хочу изменить передний цвет текста внутри текстовых полей.

Я написал следующий код, но он не меняет цвет текста внутри текстового поля на серый.

txtVersion.ForeColor = Color.Gray;


Как я могу изменить передний цвет текста, если текстовое поле сделано только для чтения?

Спасибо

5 Ответов

Рейтинг:
44

Alan N

Есть что-то странное в свойстве ForeColor системы только для чтения.Windows.Form.TextBox, который я не видел документально, хотя и не очень внимательно искал.

Я заметил, что изменение цвета переднего плана вступает в силу только после того, как цвет фона был изменен один раз. После этого любые последующие изменения переднего плана происходят немедленно.

Мое маленькое тестовое приложение:

using System;
using System.Drawing;
using System.Windows.Forms;

// Requires a form with 2 text boxes and 2 buttons

public partial class Form1 : Form {
  private readonly Color[] rainbow = new Color[] {
    Color.Red,
    Color.Orange,
    Color.Yellow,
    Color.Green,
    Color.Blue,
    Color.Indigo,
    Color.Violet
  };

  private Int32 foreIdx, backIdx;

  public Form1() {
    InitializeComponent();
    backIdx = rainbow.Length - 1;
    NormalTextBox.Text = "Standard text box";
    ReadOnlyTextBox.Text = "Read only text box";
  }

  private void ForeColBtn_Click(object sender, EventArgs e) {
    NormalTextBox.ForeColor = rainbow[foreIdx];
    ReadOnlyTextBox.ForeColor = rainbow[foreIdx];
    foreIdx = ++foreIdx % rainbow.Length;
  }

  private void BackColBtn_Click(object sender, EventArgs e) {
    NormalTextBox.BackColor = rainbow[backIdx];
    ReadOnlyTextBox.BackColor = rainbow[backIdx];
    backIdx = ++backIdx % rainbow.Length;
  }
}


Повеселиться,

Алан.


Member 11391309

ДСФ

Рейтинг:
30

OriginalGriff

Вы не можете, без большой работы.

Когда вы устанавливаете текстовое поле только для чтения, цвета переднего плана и фона переопределяются и игнорируются в пользу отключенных системой цветов - и это BAAAAD идея изменить их.

Самый простой способ сделать это - создать свой собственный элемент управления, производный от TextBox и обрабатывать только чтение самостоятельно- отключить ввод текста через событие нажатия клавиши и установить цвет самостоятельно.


Рейтинг:
2

JacoBosch

Что я сделал, так это то, что вместо использования только для чтения я использую Enabled.


Рейтинг:
1

CharlesMitchell

Вместо этого вы можете попробовать установить для текстового поля enabled значение false. Вы все еще можете изменить вещи, как вы хотите.


Рейтинг:
0

SeaWater

Установка Задний цвет свойство для любого цвета Перед установкой только для чтения свойства текстового поля истинный решить проблему:

private void setTextBoxReadOnly(TextBox txtBoxToChange)
{
    txtBoxToChange.BackColor = Color.Gray;
    txtBoxToChange.ForeColor = Color.Red;
    txtBoxToChange.ReadOnly = true;
}

private void setTextBoxNormal(TextBox txtBoxToChange)
{
    txtBoxToChange.BackColor = Color.White;
    txtBoxToChange.ForeColor = Color.Black;
    txtBoxToChange.ReadOnly = false;
}

private void btnNormal_Click(object sender, EventArgs e)
{
    setTextBoxNormal(textBox1);
}

private void btnSetReadOnly_Click(object sender, EventArgs e)
{
    setTextBoxReadOnly(textBox1);
}


В качестве альтернативы можно использовать этот многоразовый статический метод.

private static void ChangeReadOnlyTextBoxColor (
            TextBox ptxtChangeThis ,
            Color pclrNewForeColor )
        {
            Color clrBackColorOriginal = ptxtChangeThis.BackColor;
            ptxtChangeThis.BackColor = Color.Black;
            Application.DoEvents ( );
            ptxtChangeThis.BackColor = clrBackColorOriginal;
            Application.DoEvents ( );
            ptxtChangeThis.ForeColor = pclrNewForeColor;
            Application.DoEvents ( );
        }   // ChangeReadOnlyTextBoxColor