none
如何做到:Button1 可以知道游標之前的位置,以便做完事情後返回該位置。 RRS feed

  • 問題

  • 請問各位前輩,

    小弟想要一個功能如下:
    一開始游標在 Text1,這時候按下 Button1 後,游標會自動返回 Text1,
    下次游標在 Text2 時,這時候按下 Button1 後,游標會自動返回 Text2。
    意思就是說,Button1 可以知道游標之前的位置,以便做完事情後返回該位置。

    不知如何做到?
    麻煩前輩幫幫忙,謝謝感恩!
    2009年6月15日 上午 10:52

解答

  • 兩種方式都可以,第一種控制項不多的話可以去掃一圈,例如下面sample
    Dim strFocusedCtl As String = ""
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            AddHandler TextBox1.GotFocus, AddressOf TextBox_GotFocus
            AddHandler TextBox2.GotFocus, AddressOf TextBox_GotFocus
        End Sub
    
        Private Sub TextBox_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)
            strFocusedCtl = CType(sender, TextBox).Name
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If strFocusedCtl <> "" Then
                For Each c As Control In Me.Controls
                    If c.Name = strFocusedCtl Then
                        c.Focus()
                        c.Text = Now.ToString
                        Exit For
                    End If
                Next
            End If
        End Sub
    第二種,直接宣告一個參考指向Focused control,例如
    Dim txtFocusedCtl As TextBox
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            AddHandler TextBox1.GotFocus, AddressOf TextBox_GotFocus
            AddHandler TextBox2.GotFocus, AddressOf TextBox_GotFocus
        End Sub
    
        Private Sub TextBox_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)
            txtFocusedCtl = CType(sender, TextBox)
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If txtFocusedCtl IsNot Nothing Then
                txtFocusedCtl.Focus()
                txtFocusedCtl.Text = Now.ToString
            End If
        End Sub

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已標示為解答 Carlo Yang 2009年6月16日 上午 02:01
    2009年6月16日 上午 01:57
    版主

所有回覆

  • Hi,
    這個部分應該就是要自行去記錄了,我想你可以利用控制項的Tag屬性去儲存一些相關資料,例如要focus的控制項名稱,之後在button的Click事件裡面去抓 Tag屬性出來用。
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年6月15日 上午 11:57
    版主
  • Dear Bauann,

    早上看到您的訊息後,沉思了一會兒,大概想到方法了,謝謝前輩的提醒。

    小弟會先宣告一個暫存變數 string strGotFocusTemp = "";

    當每次游標到一個 TextBox 時 (GotFocus),即紀錄物件名稱覆蓋到 strGotFocusTemp 變數上,
    當按下某個按鈕時,則讀取 strGotFocusTemp 變數上的值,將 游標焦點回到該 TextBox 上。

    但是有個問題是,小弟不知道如何將文字轉換成物件名稱。。。
    例如:
    strGotFocusTemp = textBox1;
    strGotFocusTemp.Focus();  ??? 

    2009年6月16日 上午 01:39
  • 兩種方式都可以,第一種控制項不多的話可以去掃一圈,例如下面sample
    Dim strFocusedCtl As String = ""
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            AddHandler TextBox1.GotFocus, AddressOf TextBox_GotFocus
            AddHandler TextBox2.GotFocus, AddressOf TextBox_GotFocus
        End Sub
    
        Private Sub TextBox_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)
            strFocusedCtl = CType(sender, TextBox).Name
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If strFocusedCtl <> "" Then
                For Each c As Control In Me.Controls
                    If c.Name = strFocusedCtl Then
                        c.Focus()
                        c.Text = Now.ToString
                        Exit For
                    End If
                Next
            End If
        End Sub
    第二種,直接宣告一個參考指向Focused control,例如
    Dim txtFocusedCtl As TextBox
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            AddHandler TextBox1.GotFocus, AddressOf TextBox_GotFocus
            AddHandler TextBox2.GotFocus, AddressOf TextBox_GotFocus
        End Sub
    
        Private Sub TextBox_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)
            txtFocusedCtl = CType(sender, TextBox)
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If txtFocusedCtl IsNot Nothing Then
                txtFocusedCtl.Focus()
                txtFocusedCtl.Text = Now.ToString
            End If
        End Sub

    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已標示為解答 Carlo Yang 2009年6月16日 上午 02:01
    2009年6月16日 上午 01:57
    版主
  • 哈,太詳細了!

    感謝 Bauann 前輩細心詳細的指導,
    小弟決定採用第二種方式,感謝啦。

    2009年6月16日 上午 02:01
  • 另外,如果你畫面有滿多TextBox要做一樣的動作的話,這時候可以在Form_Load去掃一圈控制項,之後判斷該控制項的Type是不是TextBox,之後加AddHandler就可以把事件掛起來;這樣就不用HardCoding打很多行的addHandler了。把控制項適當的用容器(例如panel)歸類也是不錯的方式,容器都帶有controls屬性。
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年6月16日 上午 02:09
    版主
  • 恩,了解,
    實在是有很多要學的東西。

    感謝 Bauann 前輩的用心指導。
    2009年6月16日 上午 02:12