2008-11-01 82 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++。整個表格現在被禁用,但不會變灰。