代码之家  ›  专栏  ›  技术社区  ›  Hassen

从控制台输入流读取字符集计数

  •  0
  • Hassen  · 技术社区  · 16 年前

    我正试着为控制台应用程序制作一个文本框, 如何限制 Console.In 只读取用户输入的已定义字符数?

    编辑

    我不能去 Readkey() 循环方式,我仍然需要与那个框交互,比如使用箭头键向左向右导航,del或backspace编辑输入,以及一些用于验证的键。 ReadKey 正在将这些键打印为“”(空格)并且我不能依赖于计算按下了多少个键,因为 小精灵 可能会发生(在这个项目中,我们需要改写!)

    我想从指定位置的缓冲区读取数据,并在达到最大长度时将光标设置到另一个位置。可以这样做吗?

    我的机会有多大?我真的需要你的帮助

    3 回复  |  直到 16 年前
        1
  •  1
  •   Andrew    16 年前

    不能对console.readline()等设置限制,但可以将console.readline()作为循环的例子并验证其中的输入。

        2
  •  1
  •   Henk Holterman    16 年前

    我很想看看能不能做到,下面是我的想法:

        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();
        }
    

    注意,我们实际上并没有使用控制台。在这里的缓冲区中,它被忽略了。哦,我遗漏了开始这一切的功能,maxlength。但是你可以很容易地实现它。

    但如果你是认真对待这种用户界面的话,我会到处找一个诅咒库,比如 this one 但它看起来是为mono设计的,我甚至不确定它是否能在网上运行。四处搜索。

        3
  •  0
  •   SLaks    16 年前

    你可以打电话 ReadKey 环游而过 true 以防止回声。

    推荐文章