从控制台输入流中读取设定的字符数

时间:2010-04-11 20:32:52

标签: c# textbox console inputstream

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

修改

我无法进入Readkey()循环,我仍需要与该框交互,例如使用箭头键向左导航,Del或Backspace编辑输入和一些键验证。 ReadKey正在将这些键打印为“”(空格),并且我不能依赖于按下有多少键,因为可能会出现 Overtyping (在此项目中,我们需要过度分型!)

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

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

3 个答案:

答案 0 :(得分:1)

您无法在Console.ReadLine()等上设置限制。但您可以创建循环Console.ReadLine()并在其中验证输入。

答案 1 :(得分: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();
    }

请注意,我们实际上并没有在这里使用Console.In缓冲区,它被绕过了。哦,我遗漏了启动它的功能,一个maxlength。但是你可以很容易地实现它。

但是如果你认真对待这种用户界面,我会四处寻找一个curses库,比如this one但它看起来像是Mono,我甚至不确定它是否会在NET上运行。搜索。

答案 2 :(得分:0)

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