【问题标题】:C# Windows forms textbox greyed out [closed]C# Windows 窗体文本框灰显[关闭]
【发布时间】:2018-05-04 04:55:28
【问题描述】:

我会尽量做到具体。我正在使用visual basic 2010 c# express edition。我正在尝试创建一个包含程序信息的文本框。假设我将文本“Hello”放在文本框中,当我运行它时,表单有一个文本框说 Hello。 在这里,用户可以选择文本并复制它。基本上,当鼠标移过文本框时,它会改变外观并且文本框是交互式的。 我需要做的是文本框不是交互式的。在文本框属性中,有一个名为“已启用”的选项。如果我将其设为 False,则我的所有要求都已满足。但是文本框是灰色的。有什么方法可以让“启用”为假,并且仍然使文本框看起来没有变灰。我的问题是关于美学的。

【问题讨论】:

标签: c# winforms textbox


【解决方案1】:

您可以将文本框设为只读:

Creating a Read-Only Text Box (Windows Forms)

要使背景变灰,您可能需要更改背景颜色:

txtFoo.BackColor = ...;

如果您不想让文本可选择,请设置Enabled = false;

【讨论】:

  • 即使在设置为只读后,文本仍然是可选的并且光标处于活动状态。我不需要与文本进行交互。正如我所说,它需要看起来像 Enabled=true。但需要像 Enabled=false 一样工作
  • 您必须将其设置为 Enabled = false,然后更改 txtFoo.BackColor = ...;
【解决方案2】:

您可以创建自己的控件,该控件看起来与TextBox 完全相同,但将是静态的。很容易做到这一点。在解决方案资源管理器中右键单击您的项目名称并选择:Add > New Item... > Custom Control。您可以以某种方式命名它,例如DisabledTextBox

这是新控件的完整代码。

public partial class DisabledTextBox : Control
{
    public DisabledTextBox()
    {
        InitializeComponent();
        DoubleBuffered = true; // To avoid flickering
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        pe.Graphics.Clear(SystemColors.Window); // White background
        pe.Graphics.DrawRectangle(SystemPens.ActiveBorder, new Rectangle(0, 0, Width - 1, Height - 1)); // Gray border
        pe.Graphics.DrawString(Text, Font, SystemBrushes.WindowText, 1, 3); // Our text
    }

    protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
        Invalidate(); // We want to repaint our control when text changes
    }

    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);
        Height = Font.Height + 7; // This limit the height of our control so it will beahave like a normal TextBox
    }
}

当您编译它时,您的新控件将在 Toolbox 中可用,因此您可以像使用任何其他控件一样使用它。它看起来与 TextBox 完全一样。

【讨论】:

  • 非常感谢。你给了我一条路。现在我会改进它,直到我得到我想要的。
  • 对不起,我不能投票给你。我没有任何名声。不过,我很欣赏你的解决方案。谢谢
  • 当心投反对票的警察! +1 这似乎有点矫枉过正,特别是当我提供了一个 SO 帖子的链接,它只是覆盖了文本框的 OnPaint 事件并实现了海报想要的,但我不会给它 -1 因为不是最好的可能的解决方案,尽管很多人会这样做。
【解决方案3】:

textBox.BackColor = System.Drawing.SystemColors.Window;

【讨论】:

    【解决方案4】:

    将 ReadOnly 属性设置为 True 应该可以解决问题

    【讨论】:

      【解决方案5】:

      我一直在寻找这个问题的简单解决方案>

      这对我有用:

      textBox Enabled 属性 -- true

      textBox 只读属性 -- true

      下面的代码行来摆脱它们的灰色区域。

      public Test_class()
      {
      InitializeComponent();
      textBox.BackColor = System.Drawing.SystemColors.Window;
      }
      

      是的,用户仍然可以选择文本框中的值,但不能输入新值或编辑旧值。

      干杯!

      【讨论】:

        猜你喜欢
        • 2012-01-23
        • 2018-10-23
        • 2014-08-22
        • 2013-12-30
        • 2022-12-11
        • 1970-01-01
        • 2018-10-16
        • 2018-03-01
        • 1970-01-01
        相关资源
        最近更新 更多