【问题标题】:How to design a keypad in C#?如何在 C# 中设计键盘?
【发布时间】:2023-03-05 12:04:01
【问题描述】:

我是 C# 新手,我正计划设计自己的键盘,但我不知道如何/从哪里开始。如图所示,我有 4 个文本框作为键盘按钮。

我想到的第一个问题是:如何检测光标位置(光标在哪个文本框?)。

因此,例如,如果我只有一个文本框,那么我可以很容易地在 button1 内写:textBox1.text = "1",在 button2 内写:textBox1.text = "2",在 button_A 内写:textBox1.text = "A ".... 等等,但我有 4 个文本框,这很令人困惑。

您能否提供一个想法或在每个按钮内写什么以在光标所在的文本框中打印其值。

感谢专业人士。

【问题讨论】:

  • 但是一旦他点击按钮,焦点将不再在文本框上,不是吗?
  • 创建一个变量,例如int lastSelectedTextBox = 0;,当用户点击/聚焦/选择一个文本框时,相应地更改值。现在,当用户在变量上按下拨号盘switch 中的按钮并更改相应文本框的文本时。
  • 你真的不应该重新实现像键盘这样的基本功能。尝试调用内置虚拟键盘。喜欢这里的那个:stackoverflow.com/questions/8800212/…
  • @Agent_L OP 说他是新人,所以他在试水。
  • 如果您真的想自己构建键盘,那么Button 是错误的选择,因为它会将焦点从文本框移开。您应该寻找一些根本不关注的低级控件。

标签: c#


【解决方案1】:

首先,有一个文本框代表被选中的文本框(在子例程之外但在类内):

TextBox SelectedTextBox = null;

然后让每个TextBox的“点击”事件如下:

private void textBoxNUM_Click(object sender, EventArgs e)
{
    SelectedTextBox = sender as TextBox;
}

然后让每个Button的“点击”事件如下:

private void buttonNUM_Click(object sender, EventArgs e)
{
    if (SelectedTextBox != null)
    {
        SelectedTextBox.Text = buttonNUM.Text;//Or set it to the actual value, whatever.
    }
}

或者如果那个不起作用,应该这样做。

private void buttonNUM_Click(object sender, EventArgs e)
{
    if (SelectedTextBox != null)
    {
        (SelectedTextBox as TextBox).Text = buttonNUM.Text;//Or set it to the actual value, whatever.
    }
}

【讨论】:

  • 您应该在这些调用中添加 NULL 检查。如果进来的发件人不是TextBox,会抛出NullReferenceExceptions。
  • 这是正确答案。此外,请确保将处理程序也添加到设计器中的 InitializeComponent 方法中。示例:this.textBox2.Click += new System.EventHandler(this.textBox2_Click);
  • 感谢您的回答。你知道如何在加载表单时将光标设置在 textBox1 上吗?谢谢
  • 在表单的“加载”事件(或构造函数)中放入“textBox1.Select();”
  • 大部分互联网都说使用“textbox.focus();”我试过了,但没用,所以你的效果很好。非常感谢
【解决方案2】:

要检查文本框是否聚焦,您可以这样做

if(textbox1.Focused)
{
  //Print the value of the button to textbox 1
}
else if (textbox2.Focused)
{
  //Print the value to textbox 2
}

更新:

由于单击按钮时文本框将失去焦点,因此您应该有一个临时文本框(即 lastTextboxThatWasFocused),每次文本框获得焦点时都会保存该文本框。编写一个 OnFocused 方法并执行类似的操作

public void Textbox1OnFocused(/*Sender Event Args*/)
{
   lastTextboxThatWasFocused=textbox1;
}

然后点击按钮就可以了

if(lastTextboxThatWasFocused.Equals(textbox1))
{
  //ETC.
}

【讨论】:

  • 单击按钮时文本框将失去焦点,另外Focused 是属性而不是方法。此外,OP 只想检测鼠标“在”哪个控件,而不是哪个控件具有(或具有)焦点。
  • @sab669 我修复了前两件事。他怎么会在点击按钮的同时又在文本框中呢?
【解决方案3】:

您可以尝试一下这些方法。为按钮创建一个通用的单击处理程序,然后将值分配给来自按钮的文本的文本框,这恰好是值。您可以检查哪个框是最后一个聚焦于 TextBoxes 的 Click 事件的框。创建一个全局变量来存储哪个变量并在下面的方法中使用它。

        private TextBox SelectedTextBox { get; set; }

    private void NumericButton_Click(object sender, EventArgs e)
    {
        var clickedBox = sender as Button;

        if (clickedBox != null)
        {
            this.SelectedTextBox.Text += clickedBox.Text;
        }
    }

    private void TextBox_Click(object sender, EventArgs e)
    {
        var thisBox = sender as TextBox;

        if (thisBox == null)
        {
            return;
        }
        this.SelectedTextBox = thisBox;
    }

【讨论】:

  • 问题是他需要代码知道将文本放入四个文本框中的哪个。
【解决方案4】:

试试这个代码:

TextBox LastTxtBox;

private void textBox_Enter(object sender, EventArgs e)
    {
        LastTxtBox = sender as TextBox;
    }

private void button_Click(object sender, EventArgs e)
    {
        LastTxtBox.Text = this.ActiveControl.Text;
    }

为所有文本框输入事件添加textBox_Enter函数。
在所有按钮点击事件中添加button_Click

【讨论】:

  • 这和我的回答差不多,只是没那么好^_^
  • 我迟到了...思考和测试 - 我需要一些时间... ;-)
【解决方案5】:

按钮进入事件

    Control _activeControl;
    private void NumberPadButton_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        if (_activeControl is TextBox || _activeControl is RichTextBox)
        {
            _activeControl.Text += btn.Text;
            if (!_activeControl.Focused) _activeControl.Focus();
        }
    }

   

TextBox 或 RihTextBox 输入事件

    private void TextBoxEnter_Click(object sender, EventArgs e)
    {
        _activeControl = (Control)sender;
    }

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多