[英]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
屬性。
在這兩種情況下,此屬性都是一個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;
}
}
我們已經在這里創造一個迭代器被解構為一個textbox
和index
本的TextBox
的textBoxes
集合。
我們已經計算了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.