2012-01-10 44 views
0

我有一個從C#中的TextBox派生的類。我重寫OnClick方法來顯示文件打開對話框。那之後可能會失去焦點嗎?我不希望用戶能夠編輯文本,因爲此時文件名可能無效。我試圖設置ReadOnly = true,但可以在選擇文件後更改文本。以編程方式更改C中TextBox的焦點#

編輯:

我爲此添加了相關代碼。因爲它現在將重點從我的表單設置到下一個控制。

class Property : TextBox 
class FileSelectTextBox : Property 
{ 
    protected override void OnClick(EventArgs e) 
    { 
     OpenFileDialog dialog = new OpenFileDialog(); 
     Enabled = false; 
     if (dialog.ShowDialog(this) == DialogResult.OK) 
     { 
      Text = dialog.FileName; 
     } 
     Enabled = true; 
    } 
} 
+2

ASP.NET?的WinForms? whot? – Shai 2012-01-10 13:03:15

+1

你不能只是將啓用的屬性設置爲false? – JMK 2012-01-10 13:04:39

+0

@Shai WinForms應用程序 – Felics 2012-01-10 13:06:15

回答

1

您有幾種選擇在這裏:

  1. 使文本框ReadOnly。該文本框仍然會觸發OnClick事件,但該文本不會被用戶編輯。
  2. 在點擊事件結束時禁用文本框 - 缺點是點擊事件不會再次觸發(這意味着用戶將無法改變主意並選擇新文件)。
  3. 只需在點擊事件結束時將焦點設置在其他地方。 (someOtherTextBox.Focus()

編輯:一旦最後的建議:你可能希望你的文件,彈出來的FocusGained而非OnClick發生,這樣的對話仍將如果用戶接頭插入控制彈出。當然,這是你的決定,如果這種行爲是渴望或不。

編輯2:忽略最後一次編輯。這是一個糟糕的建議,我沒有想到。 (感謝擡起頭評論員)

+0

1.工作正常,但必須在顯示對話框後設置。我試圖在構造函數中設置它,但它沒有奏效。奇怪... – Felics 2012-01-10 13:18:44

+1

'FocusGained'會導致事件在對話框關閉時重複觸發..要避免這種情況,您必須將焦點更改爲其他文本框等等,這是不正確的方式(因爲該文本框可能有一些「FocusGained」活動的其他作品).. – dotNETbeginner 2012-01-10 13:36:02

0

設置文本框的ReadOnly = true財產(不要在任何時候改變它),它應該工作寂寞..

和代碼的其餘部分是這樣的...

protected override void OnClick(EventArgs e) 
     OpenFileDialog dialog = new OpenFileDialog(); 

     //user can still change/edit some non-existing file/path and click OK, so set the followings 
     dialog.CheckFileExists = true; 
     dialog.CheckPathExists = true; 

     if (dialog.ShowDialog(this) == DialogResult.OK) 
     { 
      Text= dialog.FileName; 
     } 
    }