none
我想作个根据输入的文本的宽度,自动增加宽度的文本框?可是显示有问题? RRS feed

  • 问题

  • 我想作个根据输入的文本的宽度,自动增加宽度的文本框,我订阅了TextBox的TextBox事件,处理函数如下:
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                int StringLength=(int)(this.CreateGraphics().MeasureString(textBox1.Text,textBox1.Font).Width);
                if(StringLength>textBox1.Width)//字符串长度大于控件的宽度
                {
                    textBox1.Width=StringLength;
                }


            }

    问题:输入的字符串长了以后,头几个字符跑到文本框外面了,看不到了,而且文本框右面还有一些空白,而且再多输入一些文本,又可以看到头几个字符了。

    2008年10月14日 11:45
    版主

答案

  •  

    我想我基本可以解释这个问题了,

    Code Snippet

         private void textBox1_TextChanged(object sender, EventArgs e)
            {
                int StringLength=(int)(this.CreateGraphics().MeasureString(textBox1.Text,textBox1.Font).Width);
                if(StringLength>textBox1.Width)//字符串长度大于控件的宽度
                {
                    textBox1.Width=StringLength;
                }


            }

     

     

    这里的StringLength 是不包括刚按下这个键所代表的 字符的长度,所以长度不够,左边自动隐藏了一两个字符,下面泉泉的代码解决了这个问题:

    Code Snippet

    private void textBox2_KeyDown(object sender, KeyEventArgs e)
            {
                //这里仅仅写了字母和数字
                if (!(e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) && !(e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z))
                {
                    return;
                }

                string chr = e.KeyCode.ToString();
                double dChrLength = Math.Ceiling(this.CreateGraphics().MeasureString(chr, textBox2.Font).Width);

                double dStrLength = Math.Ceiling(this.CreateGraphics().MeasureString(textBox2.Text, textBox2.Font).Width);
                double dTbLength = textBox2.Width;

                //当剩余空间不足以容纳后续录入的字符时,重设文本框长度
                if (dTbLength - dStrLength < dChrLength)
                {
                    textBox2.Width = Convert.ToInt32(dStrLength) + Convert.ToInt32(dChrLength);
                }
            }

     

     

    这段代码运行后,右边会有一些空白,而且会增加,原因有2:

    1、用了 Math.Ceiling 扩大了this.CreateGraphics().MeasureString(chr, textBox2.Font).Width;

    2、给 textBox2.Width 赋值时 要转换成int ,也有可能扩大了,

    这样右边的空白会一直增加。

     

    2008年10月14日 13:38
    版主

全部回复

  •  

    我想我基本可以解释这个问题了,

    Code Snippet

         private void textBox1_TextChanged(object sender, EventArgs e)
            {
                int StringLength=(int)(this.CreateGraphics().MeasureString(textBox1.Text,textBox1.Font).Width);
                if(StringLength>textBox1.Width)//字符串长度大于控件的宽度
                {
                    textBox1.Width=StringLength;
                }


            }

     

     

    这里的StringLength 是不包括刚按下这个键所代表的 字符的长度,所以长度不够,左边自动隐藏了一两个字符,下面泉泉的代码解决了这个问题:

    Code Snippet

    private void textBox2_KeyDown(object sender, KeyEventArgs e)
            {
                //这里仅仅写了字母和数字
                if (!(e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) && !(e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z))
                {
                    return;
                }

                string chr = e.KeyCode.ToString();
                double dChrLength = Math.Ceiling(this.CreateGraphics().MeasureString(chr, textBox2.Font).Width);

                double dStrLength = Math.Ceiling(this.CreateGraphics().MeasureString(textBox2.Text, textBox2.Font).Width);
                double dTbLength = textBox2.Width;

                //当剩余空间不足以容纳后续录入的字符时,重设文本框长度
                if (dTbLength - dStrLength < dChrLength)
                {
                    textBox2.Width = Convert.ToInt32(dStrLength) + Convert.ToInt32(dChrLength);
                }
            }

     

     

    这段代码运行后,右边会有一些空白,而且会增加,原因有2:

    1、用了 Math.Ceiling 扩大了this.CreateGraphics().MeasureString(chr, textBox2.Font).Width;

    2、给 textBox2.Width 赋值时 要转换成int ,也有可能扩大了,

    这样右边的空白会一直增加。

     

    2008年10月14日 13:38
    版主
  • 你好!
       建春,感谢你的回答!
       我认为这个事件是在Text属性改变后触发的,可能这个问题不是这样解释的,而且我试过在设置TextBox.Width时候,另外添加30像素,也是一样,头几个字符不能看到,看来不是设置的宽度不够的问题。
       另外,我使用TextChanged事件的那段代码是将计算获得的宽度(float)强制转换为int的,只可能减少宽度,不应该在右边出现空白的。可是我也看见右边有空白。
    2008年10月14日 13:56
    版主
  • 郁闷,似乎像个bug.

    2008年10月14日 14:38
    版主
  • 有什么新的进展没?

    2008年10月15日 4:55
    版主
  • 大家好!
        这个问题越来越奇怪了,大家有什么意见呢?
    2008年10月15日 14:52
    版主
  • 思考了很久,还是想不通呀!这种现象有好的解释吗?请大家指教!
    2008年10月16日 12:38
    版主
  • 大家好!
       问题还是没有解决,大家有什么看法??
    2008年10月17日 10:44
    版主
  • 如果说”左移“它发生在textBox1_TextChanged事件之前,所以textBox1_TextChanged里面加的宽度没用的,那么怎么会有 慢慢”右移“ 的现象产生呢?

     

    总觉得慢慢”右移“怎么都解释不通,泉泉的这个说法:“最终在录入足够字符后 文本框原先宽度大于字符串去掉两端保留间距后的长度,此时便能够看全了”  

     

    如果直接在 textBox1_TextChanged 里给textBox1.Width+50; 还是没有发生 “右移”.

     

     

     

     

     

    这个问题希望大家都多多关注!

     

    2008年10月18日 3:39
    版主
  • 用非托管代码实现如果没有这样的问题的话,也许就是TextBox的问题,反之就是程序问题吧。可是我不会呀。

     

    个人意见,仅供参考。

     

    2008年10月18日 15:12
  • 大家能否解释一下这种现象呢
    2008年10月20日 6:24
    版主
  • 希望大家继续关注!
    2008年10月27日 11:40
    版主