2008-09-01 116 views
6

我正在處理窗體應用程序(C#),其中用戶正在窗體中輸入數據。在編輯表單中的數據時,用戶可以在任何時候單擊表單上的某個按鈕來執行某些操作。默認情況下,焦點轉到單擊按鈕,以便用戶必須再次單擊要編輯的控件才能繼續修改表單上的數據。我需要做的是在處理按鈕點擊事件後將焦點返回到最後編輯的控件。下面是一個示例屏幕截圖,說明什麼我談論:點擊winform應用程序中的按鈕後,如何將焦點返回到上次使用的控件?

Sample App Screen Shot

用戶可以在TextBox1中,TextBox2中,textbox3等輸入數據,然後單擊按鈕。我需要按鈕將焦點返回到最近有焦點的控件,然後再單擊按鈕。

我想知道如果有人有更好的方式來實現這個功能比我想出來的。這就是我現在正在做的事情:

public partial class Form1 : Form 
    { 
     Control _lastEnteredControl; 

     private void textBox_Enter(object sender, EventArgs e) 
     { 
      _lastEnteredControl = (Control)sender; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show("Do something here"); 
      _lastEnteredControl.Focus(); 
     } 


    } 

所以基本上我們在這裏是一個類變量,指向最後輸入的控件。表單上的每個文本框都會設置爲在控件接收焦點時觸發textBox_Enter方法。然後,單擊按鈕時,焦點返回到單擊按鈕之前焦點所在的控件。任何人都有更好的解決方案嗎?

回答

16

對於一些'簡單',也許嘗試。

public Form1() 
    { 
     InitializeComponent(); 

     foreach (Control ctrl in Controls) 
     { 
      if (ctrl is TextBox) 
      { 
       ctrl.Enter += delegate(object sender, EventArgs e) 
           { 
            _lastEnteredControl = (Control)sender; 
           }; 
      } 
     } 
    } 

那麼你不必擔心手動裝飾每個文本框(或忘記一個)。

+0

您需要遞歸。 – SLaks 2010-05-30 04:00:49

0

你的實現看起來不錯 - 我想知道的是爲什麼你想這樣做呢?重點回到第一個入口是不是更可取?上一個文本框中的數據是否如此具有延展性,以至於一旦他們點擊了「被記住」的按鈕?或者你有某種按鈕對特定文本框數據執行的操作 - 在這種情況下,不應該將焦點轉移到後續控件上嗎?

我很想知道你爲什麼想要這樣做。

1

我認爲你在做什麼很好。我能想到的唯一改進就是在訪問每個控件時將其存儲到堆棧中。這會給你一個完整的訪問時間線。

1

您的方法看起來不錯。如果您想避免必須將事件處理程序添加到您添加的每個控件,則可以創建一個遞歸例程,以將GotFocus偵聽器添加到表單中的每個控件。這將適用於您表單中的任何類型的控件,但您可以調整它以滿足您的需求。

private void Form_OnLoad(object obj, EventArgs e) 
{ 
    AddGotFocusListener(this); 
} 

private void AddGotFocusListener(Control ctrl) 
{ 
    foreach(Control c in ctrl.Controls) 
    { 
     c.GotFocus += new EventHandler(Control_GotFocus); 
     if(c.Controls.Count > 0) 
     { 
      AddGotFocusListener(c); 
     } 
    } 
} 

private void Control_GotFocus(object obj, EventArgs e) 
{ 
    // Set focused control here 
} 
0

是的,我承認這個要求有點不同尋常。用戶將進入該應用程序的一些信息存在於位於幾個不同存儲庫中的舊文檔的掃描中。按鈕便於查找和打開這些舊文檔。當他們決定提交更多信息的文件以輸入表單時,很難預測用戶將在表單上的位置。儘管存在這些奇怪的情況,但其目的是使UI良好地流動。

2

你可以做以下

更改按鈕,一個標籤,使它看起來像一個按鈕。這個標籤永遠不會成爲焦點,你不必做所有額外的編碼。

0

創建一個名爲CustomTextBox的類,該類繼承自TextBox。它有一個叫做棧的靜態變量。當文本框失去焦點推入堆棧。當你想找到最後一個集中控制時,只需從堆棧中彈出第一個項目。確保清除靜態堆棧變量。

相關問題