C#Windows窗体文本框输入

C#Windows窗体文本框输入,c#,C#,我目前正在尝试制作一个应用程序(只是为了学习目的,尝试习惯C#,因为我是一个新手),我想在表单中创建一种可以说是终端的应用程序。我决定尝试使用多行文本框,并尝试使用if和else语句,但当我进入文本框并开始键入时,它会在每次击键后立即转到为“else”设置的错误消息。我不知道是什么,但我觉得我错过了什么。有什么建议吗?另外,是否可以单独为该应用程序创建我自己的“命令”?我说的是,当你输入“program_speech”时,它会弹出一个对话框,要求用户输入,它基本上会使用内置的Windows语音合

我目前正在尝试制作一个应用程序(只是为了学习目的,尝试习惯C#,因为我是一个新手),我想在表单中创建一种可以说是终端的应用程序。我决定尝试使用多行文本框,并尝试使用if和else语句,但当我进入文本框并开始键入时,它会在每次击键后立即转到为“else”设置的错误消息。我不知道是什么,但我觉得我错过了什么。有什么建议吗?另外,是否可以单独为该应用程序创建我自己的“命令”?我说的是,当你输入“program_speech”时,它会弹出一个对话框,要求用户输入,它基本上会使用内置的Windows语音合成器将文本转换为语音。谢谢感谢您的帮助

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Terminator //Lol Terminator Reference
{
    public partial class Form1 : Form
    {
        private string answer;

        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (answer == "help")
            {
                MessageBox.Show("There is only 2 commands as of now and that is 'help' and 'program_speech' ");
            }
            else if (answer == "program_speech")
            {
                MessageBox.Show("Still currently under creation");
            }
            else
            {
                MessageBox.Show("Invalid Command. Please try again or type help for current available commands");
            }
        }
    }
}

您必须确保正在使用
TextBox
的值初始化
answer
变量的值,并将事件从TextChanged更改为LostFocus

private void textBox1_LostFocus(object sender, EventArgs e)
{

  answer = textBox1.Text;

  if (answer == "help")
  {
    MessageBox.Show("There is only 2 commands as of now and that is 'help' and 'program_speech' ");
  }
  else if (answer == "program_speech")
  {
    MessageBox.Show("Still currently under creation");
  }
  else
  {
    MessageBox.Show("Invalid Command. Please try again or type help for current available commands");
  }
}

每次击键时都会引发一个名为TextChanged的事件,它会转到“无效命令”的else条件,因为当时该文本框中的文本既不是“帮助”也不是“程序语音”。绝对不建议使用TextChanged

您应该使用按钮及其单击事件来检查textbox的值。因为这是确保所有所需文本都已写入的唯一方法。可能是这样的-

    private void btnCheckText_Click(object sender, EventArgs e)
    {
        answer = textBox1.Text;

        if (answer == "help")
        {
            MessageBox.Show("There is only 2 commands as of now and that is 'help' and 'program_speech' ");
        }
        else if (answer == "program_speech")
        {
            MessageBox.Show("Still currently under creation");
        }
        else
        {
            MessageBox.Show("Invalid Command. Please try again or type help for current available commands");
        }
    }

最好做一个输入按钮,在按下输入按钮后从文本框中读取文本

private void Button1_Enter(object sender, EventArgs e)
        {

            input = textbox.Text;
           //then do a switch case

初始化
应答
textbox1.text
。我想你已经不知怎么做到了。如果不是,基索的答案就是你应该做的

发生这种情况的原因是,您的
textBox1\u TextChanged
将在每次您的文本框中发生一次更改时被解雇。因此,当您键入任何字母时,文本框文本将发生变化,函数将被触发,从而触发else语句。例如,键入
h
,==>Textbox注册更改并调用
textBox1\u TextChanged
,因为文本不是
help
,如果在else部分中出现。重复此操作直到
hel
为止,直到您完全输入
help

如果您在文本框最终读取
help
时尝试,它将跟随
MessageBox.Show(“目前只有两个命令,即“help”和“program_speech”)指定的命令

根据对话内容,你需要创建一个新的表单,并在需要时调用它。正如你们提到的,我会推荐你们看这个教程。我知道它已经过时了,但它涵盖了你的大部分疑虑。我是从它开始的,我想你也应该这样

此外,我不认为多行文本框是最好的选择,当你想做一个终端一样的结构。希望我消除了你的大部分疑虑。

好吧, 我想我已经发现了问题所在。 名为“answer”的
字符串
变量是否应该存储用户输入的命令? 因为在你的代码中没有提到它, 因此,请尝试在
text\u changed
void的开头添加这一行:

answer = textBox1.Text;
如果您是C#新手,这意味着您使用textBox1的属性文本并将其存储在answer中

希望它能起作用

我在这里读过答案

原因已找到问题。因为文本更改事件是在文本框的文本更改的每次更改时触发的

这里提到了两个很好的工作建议

  • 要使用独占按钮并在按钮单击时执行逻辑

  • 使用Textbox的失去焦点事件

这两种方法都要求用户最终离开文本框。(因此,如果他想输入另一个命令,他需要在终端(文本框)中重新输入

但在这里,我想知道为什么没有人建议跟踪
Enter
press,只有在按下Enter键时才执行逻辑。在这里,用户不必离开终端(textbox)而不费吹灰之力地发出另一个命令

你可以像下面这样做

首先,使用Textbox的“向上键”事件,稍后将触发该事件,然后单击“向下键”(以确保在Textbox中正确输入输入)


谢谢!我刚刚添加了它,但我似乎在每次按键后都会遇到同样的错误。然后你应该将事件从TextChange更改为LostFocusOkay,我知道发生了什么。谢谢!我让它运行起来了谢谢!现在关于终端接口的最后一部分,我该如何处理?我只能给出一些提示。做2文本框。1非只读。在另一个文本框中,用户给出输入并点击旁边的按钮。单击按钮可清除文本框内容,并释放另一个文本框中的输出,条件为“如果”。如果不想使用该按钮,请查看并确保将onKeyDown listener设置为@Rishav onKeyDown listener的函数直到OP实际遇到同样的问题。它将在每次按键时出现,这将产生同样的问题,控件将进入“else”部分。@ArpitGupta如果你检查我提供的链接,你会发现答案会专门检查
Enter
是否被点击。如果被点击,OP应该调用检查e条件(此处为
textBox1\u TextChanged
,在本例中不是最佳函数名称,因为它不再是
textchange事件
)。在我的示例中,OP没有
textboxChange
的侦听器。应该是“只有两个命令”:P
    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
           answer = textBox1.Text;
           if (answer == "help")
           {
               MessageBox.Show("There is only 2 commands as of now and that is 'help' and 'program_speech' ");
           }
           else if (answer == "program_speech")
           {
               MessageBox.Show("Still currently under creation");
           }
           else
           {
               MessageBox.Show("Invalid Command. Please try again or type help for current available commands");
           }
        }
    }