一个有趣的技术,请问怎么实现!

ah_2056 2014-10-08 03:31:36
之前做WINFORM都是固定死了的文本框,写起代码来比较方便,今天遇到个项目,是动态的,实现某些功能就不太会!

大致是:
比如用户录入文本框数,10个,那么就生成10个文本框。
当焦点在第一个文本框的时候,如果客户按下↓,则,将光标转移至第二个文本框,依次类推。
当焦点在第一个文本框的时候,如果客户按下↓,则,将光标转移至第三个文本框;如果客户按下↑的时候,光标则移至第一个文本框,依次类推。
请问,这种处理该怎么做?假如100个文本框呢。
...全文
467 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
feixuyue 2014-10-09
  • 打赏
  • 举报
回复
拦截键盘消息,controls.addcontriol(new textbox())
phommy 2014-10-09
  • 打赏
  • 举报
回复
捕获到这两个键直接SendKey一个tab或shift+tab就好。。如果控件默认顺序不对,就要通过TabIndex或SetChildIndex设置下跳转顺序
猴子写代码 2014-10-09
  • 打赏
  • 举报
回复
...你的文本控件是放到一个容器中(比如panel)的吧,容器本身就有控件的结合:容器.Controls,Controls里面的索引是按照控件的创建顺序, 解决方案:1.用一个全局变量记录当前焦点索引focusIndex,默认0 2.按上直接就是: 容器.Controls[focusIndex-1].Focus(); ,当然要判断索引的位置哦,即focusIndex-1不能小于0,按下不用我写了吧
林英南 2014-10-09
  • 打赏
  • 举报
回复
如果仅仅是文本控件,可能用gridview更好做一些,如果还有其他的一些东西,例如label之类的,可以自己设计一个控件来包含这些,然后就无限循环使用吧……
失落的神庙 2014-10-09
  • 打赏
  • 举报
回复
当焦点在第一个文本框的时候,如果客户按下↓,则,将光标转移至第个文本框,依次类推。 当焦点在第一个文本框的时候,如果客户按下↓,则,将光标转移至第个文本框;如果客户按下↑的时候,光标则移至第
失落的神庙 2014-10-09
  • 打赏
  • 举报
回复
[color=#FF0000]当焦点在第一个文本框的时候,如果客户按下↓,则,将光标转移至第个文本框,依次类推。 当焦点在第一个文本框的时候,如果客户按下↓,则,将光标转移至第[/color]个文本框;如果客户按下↑的时候,光标则移至第一个文本框,依次类推。 到底是第几个哦。
jy251 2014-10-08
  • 打赏
  • 举报
回复
觉得还好,写个类,继承自textbox,给他一个public的int,当做是textbox组的索引 建立textbox的数组,别用循环了,每次切换焦点的时候,获取当前焦点textbox的索引,然后索引+1就是下一个的,当然了,如果到了数组上限,索引归0(从0开始的索引) 根据索引在textbox的数组中找textbox 对了,你还得自己写个panel,继承自panel,这个panel加一个public的item属性,类型为textbox,并且做一个add函数,add一次就给panel.controls里面加一个textbox,这些textbox的dock就设置为top好了,这样就行了 如果数量太大了,比如你说的100个,我是真不建议用textbox对象了,gdi+画一个textbox都比用实际的textbox强,至少不卡
threenewbee 2014-10-08
  • 打赏
  • 举报
回复
就你的需求,用datagridview更好。
jaccopa 2014-10-08
  • 打赏
  • 举报
回复
引用 楼主 ah_2056 的回复:
之前做WINFORM都是固定死了的文本框,写起代码来比较方便,今天遇到个项目,是动态的,实现某些功能就不太会! 大致是: 比如用户录入文本框数,10个,那么就生成10个文本框。 当焦点在第一个文本框的时候,如果客户按下↓,则,将光标转移至第二个文本框,依次类推。 当焦点在第一个文本框的时候,如果客户按下↓,则,将光标转移至第三个文本框;如果客户按下↑的时候,光标则移至第一个文本框,依次类推。 请问,这种处理该怎么做?假如100个文本框呢。
引用 9 楼 xxxuan 的回复:
foreach,用panel加随便加多少个
我觉得这个肯定会有一个数量限制的,比如不会超过100个,这样的话,你可以直接开始就搞100个textbox,用的时候再show出来
  • 打赏
  • 举报
回复
你可以取到每一个 TextBox 的 location(x、y坐标),然后加上高度(h)和宽度(w),可以知道 TextBox 的底边和右边。 如果判断一个 TextBox 的“右边”是什么 TextBox,那么选择 x2>=x1+w1 && y2<=y1+h1 && y2+h2>=x1 的 TextBox,并且 abs(x2- x1-w1) 最小的(最近的),然后设置它为焦点。 先择下边或者上边也是一样。 不要用什么List或者Tag来设置。因为你设置不过来,在你用鼠标拖动TextBox的时候,不可能手工改动那个数据。
xxxuan 2014-10-08
  • 打赏
  • 举报
回复
foreach,用panel加随便加多少个
sunny906 2014-10-08
  • 打赏
  • 举报
回复

        TextBox[] txt = new TextBox[100];
        private void button3_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < txt.Length; i++)
            {
                txt[i] = new TextBox();
                txt[i].Left = 10;
                txt[i].Top = 10 + 35 * i;
                txt[i].Width = 90;
                txt[i].Height = 30;
                txt[i].Name = "txt" + i.ToString();
                txt[i].KeyDown += MyKeyDown;
                this.Controls.Add(txt[i]);
            }
        }

        void MyKeyDown(object sender, KeyEventArgs e)
        {
            int index = int.Parse(Regex.Match((sender as TextBox).Name, @"\d+").Value);
            if (e.KeyValue == 40)
            {
                if (index == txt.Length - 1)
                {
                    index = 0;
                }
                else
                {
                    index++;
                }
            }
            else if (e.KeyValue == 38)
            {
                if (index == 0)
                {
                    index = txt.Length - 1;
                }
                else
                {
                    index--;
                }
            }
            txt[index].Focus();
        }
於黾 2014-10-08
  • 打赏
  • 举报
回复
引用 5 楼 Icedmilk 的回复:
就是用控件数组,用代码来设置布局。可以使用List<T> 可以用indexof来判断当前是第几个控件
如果需要一个一个加上去,还能一个一个删除,当然是List<TextBox>更好了 如果仅仅是固定生成多少个,数组就足够了.
gw6328 2014-10-08
  • 打赏
  • 举报
回复
动态的就可以了 TextBox[] tbs=new TextBox[100] 分别设置tabindex,还要处理上,下键
Icedmilk 2014-10-08
  • 打赏
  • 举报
回复
就是用控件数组,用代码来设置布局。可以使用List<T> 可以用indexof来判断当前是第几个控件
於黾 2014-10-08
  • 打赏
  • 举报
回复
先建立个textbox[ ]数组,生成一堆textbox,然后循环把他们放到panel里 循环给它们挂上相同的keydown事件 事件里做判断,判断当前的索引,是否是第一个或最后一个,然后就上一个.focus,下一个.focus呗,其实没多难
bdmh 2014-10-08
  • 打赏
  • 举报
回复
没有,什么都给你实现,要程序员干嘛
ah_2056 2014-10-08
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
你可以动态给文本框起名,比如 txt1,txt2,txt3.。。 按箭头时,递增后面的数组,然后controls["txt"+i.ToString]找到下一个 或者创建下一个时,将上一个txt的tag保存为新创建的这个txt,这样通过访问tag就可以访问下一个 当然你还可以自定义text,里面可以有next,prior等属性,实现链表
很麻烦,不知道有木有简单的办法。
bdmh 2014-10-08
  • 打赏
  • 举报
回复
你可以动态给文本框起名,比如 txt1,txt2,txt3.。。 按箭头时,递增后面的数组,然后controls["txt"+i.ToString]找到下一个 或者创建下一个时,将上一个txt的tag保存为新创建的这个txt,这样通过访问tag就可以访问下一个 当然你还可以自定义text,里面可以有next,prior等属性,实现链表

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧