2008-11-01 84 views
5

很长时间后回到VS2008中的WinForms ..修补VS2008 Express Edition中的OOD问题。如何使Windows窗体控件只读?

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

启用属性设置为false:灰显控件内容。我希望控制看起来很正常。 The 锁定属性设置为false:似乎在保护用户不会意外扭曲Visual Form Designer中的控件。

我错过了什么?

+0

>我想控制看起来很正常。我只想指出,拥有与可编辑控件相同的只读控件是一种可怕的UI体验。 – FlySwat 2008-11-01 19:08:17

+0

注意点。这是一个假的/测试的应用程序,只是演示了一些东西..我认为用户体验神将让我活下去:) – Gishu 2008-11-01 19:11:15

回答

3

文本框

.ReadOnly属性为true

没有只读的控件

其他控件一直没有ReadOnly属性。您将需要使用活动来启动编辑过程并保持您的值不可编辑。

1

两个相关属性ReadOnly和Enabled。 ReadOnly = true可以防止编辑灰色背景,但仍然可以实现焦点。 Enabled = false灰色背景,文本并防止编辑或聚焦。 Windows用户界面约定为用户提供了一个视觉提示,表明控件是只读的(这样他们就不会试图编辑它并随后受挫)。灰色禁用状态是已定义的系统约定,但它可以提供太多的提示(而不是足够可信的)。

最简单的路线是probababy将您的控件设置为ReadOnly,将背景设置为System.Drawing.SystemColors.Window,然后阻止焦点消息。您可以通过捕获OnEnter事件并立即将Focus移动到另一个不是只读的控件(例如Close或Edit按钮)来实现此目的。或者你可以派生你自己的控制并吃任何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); 
    } 
} 
4

为了使形式瞬间控制只读上点击确实使用代码以下peice的:

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()); 
     } 
    } 

然后从按钮的Click事件调用它是这样的:

LockControlValues(this) 

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

快乐编程,

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

0

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

所以我更换一个电话

form->Enabled = false; 

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

哪些行之有效。您可以在上面看到我正在使用托管C++。整个表格现在被禁用,但不会变灰。