【问题标题】:reading a set count of characters from the console input stream从控制台输入流中读取一组字符
【发布时间】:2011-02-06 19:08:18
【问题描述】:

我正在尝试为控制台应用程序制作类似于文本框的东西, 如何将Console.In 限制为仅从用户输入中读取定义的字符数?

编辑

我无法使用Readkey() 循环方式,我仍然需要与该框进行交互,例如使用箭头键左右导航,使用 Del 或 Backspace 编辑输入以及一些用于验证的键。 ReadKey 正在将这些键打印为“”(空格),我不能指望按下了多少键,因为可能会发生 Overtyping(在这个项目中,我们需要过度输入!)

我正在考虑诸如从指定位置的缓冲区读取数据,并在达到该字段最大长度时将光标设置到另一个位置。可以这样吗?

我的机会是什么?我真的需要你的帮助

【问题讨论】:

  • 我认为他的意思是他只希望输入回显特定数量的字符(即让控制台模拟在TextBox 上设置MaxLength 属性)。

标签: c# textbox console inputstream


【解决方案1】:

我很想知道它是否可以完成,这是我想出的:

    private static string ReadBox(int maxLen)
    {
        var sb = new StringBuilder();
        int pos = 0;
        bool done = false;      
        int start = Console.CursorLeft;

        while (!done)
        {
            var ki = Console.ReadKey(true);

            switch (ki.Key)
            {
                case ConsoleKey.Enter:
                    done = true;
                    break;

                case ConsoleKey.Delete:
                    // todo
                    break;

                case ConsoleKey.Backspace:
                    if (pos > 0)
                    {
                        pos -= 1;
                        sb.Remove(pos, 1);
                    }                                
                    break;

                case ConsoleKey.LeftArrow:
                    if (pos > 0) pos -= 1;
                    break;

                case ConsoleKey.RightArrow:
                    if (pos < sb.Length) pos += 1;
                    break;

                default:
                    if (ki.KeyChar >= ' ')  // simple filter
                    {
                        sb.Insert(pos, ki.KeyChar);
                        pos += 1;
                    }
                    break;
            }
            Console.CursorLeft = start;
            Console.Write(sb.ToString());
            Console.CursorLeft = start + pos;                
        }
        return sb.ToString();
    }

请注意,我们实际上并没有使用控制台。这里的缓冲区中,它被绕过了。哦,我忽略了启动这一切的功能,即最大长度。但是你可以很容易地实现它。

但如果你对这种 UI 很认真,我会四处寻找一个 curses 库,比如 this one 但它看起来像是为 Mono 设计的,我什至不确定它是否可以在 NET 上运行。到处搜索。

【讨论】:

  • 谢谢,我确实从你的代码中学到了一些东西,但他没有做这项工作,退格键不起作用,我在处理 INS 和 DEL 键时遇到了一些问题,我需要使用 Console.ReadLine() 时的行为相同。我没有看到任何使用 ReadKey() 的解决方案
  • 你注意到删除案例中的评论了吗?
【解决方案2】:

您可以在循环中调用ReadKey 并传递true 以防止回显。

【讨论】:

  • 其实你已经通过了(Intercept=)true。并处理光标、退格、删除等
  • 我已经编辑了我的帖子,但我仍然需要使用退格键和删除键,ReadKey() 只会回显它们或拒绝它们
【解决方案3】:

您不能对 Console.ReadLine() 等设置限制。但您可以制作循环 Console.ReadLine() 例如并验证其中的输入。

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多