簡體   English   中英

如何按順序向文本框輸入數據

[英]How can I enter data to Textboxes sequentially

我是 C# 的新手,我正在嘗試在 Visual Studio 中編寫代碼。 我需要你的幫助。

我想通過 C# 中的手持條碼掃描儀以表格形式在 tabpage1 中的 20 個文本框中輸入數字。 從條碼掃描器讀取后,光標必須轉到下一個文本框。 我將為每個文本框檢查具有某些條件(在 2 個值之間等)的讀取數據。

我寫了一些代碼,但它使代碼大小變大。 我認為這一定很簡單,我需要您的評論和幫助。

條碼掃描器讀取條碼並發送條碼編號+輸入代碼。 條形碼掃描儀讀取並將數字放入第一個文本框,然后傳遞給下一個文本框,並為所有文本框重復 - 我怎樣才能輕松做到這一點?

謝謝

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        textBox1.SelectAll();
        textBox2.Focus();
        e.Handled = true;
    }
}

private void textBox2_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        textBox2.SelectAll();
        textBox3.Focus();
        e.Handled = true;
    }
}
.
.
.
.
private void textBox20_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        textBox20.SelectAll();
        textBox1.Focus();
        e.Handled = true;
    }
}

這是解決問題的想法

class Program
{
    LinkedList<TextBox> _textBoxes;
    ctor()
    {
        _textBoxes = new LinkedList<TextBox>();
        _textBoxes.List.AddLast(textbox1);
        _textBoxes.List.AddLast(textbox20);
    }

    private void textBox_KeyDown_justOneCommonHandle(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            var textboxCurrent = _textBoxes.Current;
            // make sure that Value is the sender

            textboxCurrent.SelectAll();

            _textBoxes.MoveNext();
            var textboxNext = _textBoxes.Current;
            // check the end of list

            textboxNext.Focus();

            e.Handled = true;
        }
    }
}

好消息是sender對象始終是觸發事件的控件。 換句話說, sender是對您的TextBox之一的引用。

您可以利用這一事實,並且您可以擁有一個事件處理程序,它可以重復用於多個事件。

private void textBoxN_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        var textBoxCurrent = sender as TextBox;
        textBoxCurrent.SelectAll();
        //TODO: set focus for next 
        e.Handled = true;
    }
}

那么,下一個問題是如何獲得對下一個TextBox的引用?
您可以為此使用Tag屬性。

  • WinForms的情況下, Control對象有一個名為Tag的屬性。
  • WPF的情況下, FrameworkElement對象有一個名為Tag的屬性。

在這兩種情況下,此屬性都是一個object因此我們可以在其中存儲任何內容。 如果我們使用對下一個TextBox的引用來填充它,那么通用處理程序將如下所示:

private void textBoxN_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        var textBoxCurrent = sender as TextBox;
        textBoxCurrent.SelectAll();
        
        var textBoxNext = textBoxCurrent.Tag as TextBox;
        textBoxNext.Focus();
        e.Handled = true;
    }
}

還剩下什么?

  • 填充Tag屬性
  • 訂閱KeyDown事件
private void Init()
{
    var textBoxes = new List<TextBox> { TextBox1, TextBox2, ..., TextBox20 };
    foreach(var item in textBoxes.Select((textBox, index) => (textBox, index))
    {
         var nextIdx = (item.index + 1) % textBoxes.Count;
         item.textBox.Tag = textBoxes[nextIdx];
         item.textBox.KeyDown += textBoxN_KeyDown;
    }

}

我們已經在這里創造一個迭代器被解構為一個textboxindex本的TextBoxtextBoxes集合。

我們已經計算了nextIdx的下一個TextBox索引。 然后我們把所有東西都連接起來了。

@彼得Csala,@Ivan Stavenchuk
感謝您的想法和幫助。 我解決了我的問題,如下所示

我添加了一個主文本框(textBox21)並使用了主文本框的 keydown 事件

   private void textBox21_KeyDown(object sender, KeyEventArgs e)
    {
            TextBox tb = new TextBox();
        tb.Name = "textBox" + i.ToString();

       if (e.KeyCode==Keys.Enter)
        { 
        TextBox tbx = this.Controls.Find(tb.Name, true).FirstOrDefault() as TextBox;
        tbx.Text   = textBox21.Text ;
            i++;
            if (i>20) i=1;
            textBox21.SelectAll();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM