【问题标题】:How do I make a Windows Forms control readonly?如何将 Windows 窗体控件设为只读?
【发布时间】:2008-11-01 18:54:41
【问题描述】:

时隔许久回到VS2008的WinForms..修补VS2008 Express版的OOD问题。

我需要一些控件作为“仅显示”小部件。用户不应该能够更改这些控件的值......小部件由定期更新滴答事件更新。我隐约记得有一个 ReadOnly 属性可以设置为具有此行为...现在找不到它。

Enabled 属性设置为 false:使控件内容变灰。我希望控件看起来正常。 Locked 属性设置为 false:似乎是在保护用户免于意外扭曲可视表单设计器中的控件。

我错过了什么?

【问题讨论】:

  • >我希望控件看起来正常。我只想指出,拥有与可编辑控件相同的只读控件是一种可怕的 UI 体验。
  • 注意点。这是一个假的/测试应用程序,只是为了演示一些东西。我认为用户体验之神会让我活下去:)
  • 再想一想,我认为图像将是最好的答案。我的表格只是实时显示不同阀门的状态。每个小部件需要根据支持字段值显示不同的图像
  • 相关帖子 - Make TextBox uneditable

标签: c# .net winforms


【解决方案1】:

对于一些典型的winforms控件:

http://jquiz.wordpress.com/2007/05/29/c-winforms-readonly-controls/

这也是保持外观的好技巧:

    Color clr = textBox1.BackColor;
    textBox1.ReadOnly = true;
    textBox1.BackColor = clr;

【讨论】:

  • Aah.. Readonly 用于纯文本框。单选按钮也很容易。我有一个组合框需要一个丑陋的 hack.. 另一方面,如果它只是只读的.. 我不妨把它变成一个标签或文本框。谢谢会接受这个,除非我们有新的竞争者。
  • 我同意乔纳森的观点,但如果你真的需要,我只是添加了该提示。
【解决方案2】:

要使表单一键立即只读,请使用以下代码:

    public void LockControlValues(System.Windows.Forms.Control Container)
    {
        try
        {
            foreach (Control ctrl in Container.Controls)
            {
                if (ctrl.GetType() == typeof(TextBox))
                    ((TextBox)ctrl).ReadOnly = true;
                if (ctrl.GetType() == typeof(ComboBox))
                    ((ComboBox)ctrl).Enabled= false;
                if (ctrl.GetType() == typeof(CheckBox))
                    ((CheckBox)ctrl).Enabled = false;

                if (ctrl.GetType() == typeof(DateTimePicker))
                    ((DateTimePicker)ctrl).Enabled = false;

                if (ctrl.Controls.Count > 0)
                    LockControlValues(ctrl);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

然后像这样从您的按钮单击事件中调用它:

LockControlValues(this)

希望,这有助于解决您的问题:

快乐编程,

拉詹·阿罗拉 www.simplyrajan.co.nr

【讨论】:

    【解决方案3】:

    文本框

    .ReadOnly 属性为 true

    没有 ReadOnly 的控件

    其他控件并非一直都有 ReadOnly 属性。您将需要使用事件来取消编辑过程并保持您的值不可编辑。

    【讨论】:

      【解决方案4】:

      两个相关属性 ReadOnly 和 Enabled。 ReadOnly = true 防止编辑使背景变灰,但它仍然允许焦点。 Enabled = false 使背景、文本变灰并阻止编辑或聚焦。

      Windows UI 约定指示向用户提供控件是只读的视觉提示(这样他们就不会尝试编辑它并随后感到沮丧)。灰显的禁用状态是定义的系统约定,但它有太多的暗示(而不是足够清晰的暗示)。

      最简单的方法是将控件设置为 ReadOnly,将背景设置为 System.Drawing.SystemColors.Window,然后阻止焦点消息。您可以通过捕获 OnEnter 事件并立即将 Focus 移动到另一个非只读控件(例如,关闭或编辑按钮)来做到这一点。或者您可以派生自己的控制权并吃掉任何 WM_SETFOCUS 消息。下面的例子。

      我相信各种第三方控件集为您提供了额外的选项和粒度。

      public class ReadOnlyTextBox : TextBox
      {
         const uint WM_SETFOCUS = 0x0007;
      
         public ReadOnlyTextBox()
         {
            this.ReadOnly = true;
            this.BackColor = System.Drawing.SystemColors.Window;
            this.ForeColor = System.Drawing.SystemColors.WindowText;
         }
      
         protected override void WndProc(ref Message m)
         {
            // eat all setfocus messages, pass rest to base
            if (m.Msg != WM_SETFOCUS)
               base.WndProc(ref m);
         }
      }
      

      【讨论】:

        【解决方案5】:

        昨天我在工作中也得到了同样的要求。除了不是文本框,我必须禁用整个表单而不更改它的颜色。

        所以我换了一个电话

        form->Enabled = false;
        

        IntPtr hWnd = form->Handle;
        HWND window_handle = (HWND)hWnd.ToPointer();
        ::EnableWindow(window_handle, aEnable ? TRUE:FALSE);
        

        效果很好。您可以在上面看到我正在使用托管 C++。整个表单现在被禁用,但没有变灰。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-19
          相关资源
          最近更新 更多