winform文本框超出

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform文本框超出相关的知识,希望对你有一定的参考价值。

ppt出现文本框中输入文字超出文本框范围的详细操作
首先,打开我们的ppt软件,然后开启并进入到ppt中文本框文字内容会超出文本框范围的文档之中。
进入后,我们可以在文本框中输入文字内容,看看随着文字的不断输入,文字内容是否会超出文本框范围。
若输入文字内容后看到文字已超出文本框范围,我们直接选中文本框,然后点击鼠标右键,选择右键菜单中的“设置形状格式”选项。
打开“设置形状格式”弹窗之后,我们在弹窗顶部的菜单栏中先选择“文本选项”菜单卡,然后接着在下面继续选择“文本框”选项。
在“文本框”选项卡下面,我们展开“文本框”设置选项,在里面找到“不自动调整”选项,然后将其更换为“根据文字自动调整形状大小”选项。
更改后,就可以文本框的大小会随着文字内容的多少而自动更改,即便继续输入文字,文本框也会随之自动变更大小。
参考技术A winform文本框超出后显示省略号第一步: 溢出隐藏。overflow: hidden;
第二步:让文本不会换行, 在同一行继续。white-space: nowrap;
第三步:用省略号来代表未显示完的文本。text-overflow: ellipsis;有一个TextBox文本控件名为txtShow 有2个按钮:开始 btnStart 和 结束 btnStop 一个时钟控件名为 timer1 int i=0;成员变量,用来取数组中固定索引的值 string[]str=new string[]"aaa","bbb","ccc...

可扩展的 WinForms 文本框

【中文标题】可扩展的 WinForms 文本框【英文标题】:Expandable WinForms TextBox 【发布时间】:2010-11-15 11:15:56 【问题描述】:

我在 Windows 窗体应用程序中创建了一个文本框,该文本框从一个高度开始,用于在单行中输入文本。但是,如果用户输入包含在控件中的文本,我希望文本框自动增加其高度。

目前,对于这个文本框,我将属性 multiline 和 wordwrap 设置为 true。我尝试使用 TextChanged 事件来确定文本何时被换行,但我找不到任何可以帮助我解决此问题的属性。 Lines 属性不提供任何包装文本的帮助;仅适用于用户按回车键开始新行的文本。

如何让我的文本框在每次文本换行超过文本框宽度时扩展其高度?

【问题讨论】:

【参考方案1】:

与其他人发布的想法相同,将其放入您的 textChanged 事件中:

Dim s As SizeF = TextRenderer.MeasureText(txt.Text, txt.Font, txt.ClientRectangle.Size, TextFormatFlags.WordBreak)
txt.Height = CInt(s.Height)

您将需要某种最小高度,并且可能需要指定一些填充,但这确实有效。

【讨论】:

很好的答案,我将在我的项目中使用它。谢谢!【参考方案2】:

如果您愿意改用 RichTextBox(根据我的经验,这是一种带有很多怪癖的脾气暴躁的控件),您可以使用 ContentsResized 事件,它会为您提供新的所需大小:

private void HandleContentsResized(object sender, ContentsResizedEvenetArgs e)

    int newheight = e.NewRectangle.Height;

【讨论】:

【参考方案3】:

我只是为另一个项目的标签控件编写了这个。我从代码项目的某个地方得到了我认为的代码。将其更改为文本框应该与更改基础一样简单。

public class GrowLabel : Label

    private bool _growing;
    //public bool GrowFontSize  get; set; 

    public GrowLabel()
    
        AutoSize = false;
        //GrowFontSize = false;
    

    public override sealed bool AutoSize
    
        get  return base.AutoSize; 
        set  base.AutoSize = value; 
    

    private void ResizeLabel()
    
        if (_growing) return;
        try
        
            _growing = true;

            var sz = new Size(Width, Int32.MaxValue);
            sz = TextRenderer.MeasureText(Text, Font, sz, TextFormatFlags.WordBreak);
            Height = sz.Height;
        
        finally
        
            _growing = false;
        
    

    protected override void OnTextChanged(EventArgs e)
    
        base.OnTextChanged(e);
        ResizeLabel();
    

    protected override void OnFontChanged(EventArgs e)
    
        base.OnFontChanged(e);
        ResizeLabel();
    

    protected override void OnSizeChanged(EventArgs e)
    
        base.OnSizeChanged(e);
        ResizeLabel();
    

【讨论】:

谢谢,AdamSane,这也是一个非常好的答案。我发现 Andy's 更简单,于是改用它。【参考方案4】:

AdamSane 的帖子很有帮助,但文本框没有增长。我会做一些修改。我的模组如下:

class GrowTextBox : TextBox

    private double m_growIndex = 0.0;
    private Timer m_timer;

    public GrowTextBox()
    
        AutoSize = false;
        this.Height = 20;

        // Without the timer, I got a lot of AccessViolationException in the System.Windows.Forms.dll.
        m_timer = new Timer();
        m_timer.Interval = 1;
        m_timer.Enabled = false;
        m_timer.Tick += new EventHandler(m_timer_Tick);

        this.KeyDown += new KeyEventHandler(GrowTextBox_KeyDown);
    

    void GrowTextBox_KeyDown(object sender, KeyEventArgs e)
    
        if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
        
            this.SelectAll();
        
    

    void m_timer_Tick(object sender, EventArgs e)
    
        var sz = new Size(Width, Int32.MaxValue);
        sz = TextRenderer.MeasureText(Text, Font, sz, TextFormatFlags.TextBoxControl);

        m_growIndex = (double)(sz.Width / (double)Width);

        if (m_growIndex > 0)
            Multiline = true;
        else
            Multiline = false;

        int tempHeight = (int)(20 * m_growIndex);

        if (tempHeight <= 20)
            Height = 20;
        else
            Height = tempHeight;

        m_timer.Enabled = false;
    

    public override sealed bool AutoSize
    
        get  return base.AutoSize; 
        set  base.AutoSize = value; 
    


    protected override void OnTextChanged(EventArgs e)
    
        base.OnTextChanged(e);
        m_timer.Enabled = true;
    

    protected override void OnFontChanged(EventArgs e)
    
        base.OnFontChanged(e);
        m_timer.Enabled = true;
    

    protected override void OnSizeChanged(EventArgs e)
    
        base.OnSizeChanged(e);
        m_timer.Enabled = true;
    

【讨论】:

【参考方案5】:

我成功使用下面的代码直到第 10 行,然后它会减少 1 个字符,但这对我有用。不要问我 - 7 和 - 12 之类的随机数,它们与填充有关

    private void txbDescription_TextChanged(object sender, EventArgs e)
    
        SizeF s = TextRenderer.MeasureText(txbDescription.Text, txbDescription.Font, txbDescription.ClientRectangle.Size, TextFormatFlags.TextBoxControl);

        int lines = (int)Math.Ceiling((decimal)Convert.ToInt32(s.Width - 7) / ((decimal)txbDescription.Width - 12));

        if (lines == 0)
        
            txbDescription.Height = 20;
        
        else
        
            txbDescription.Height = 20 + (lines - 1) * 13;
        
    

【讨论】:

【参考方案6】:

很遗憾,我无法提供具体细节,但您可能需要进行自定义实现。

我会派生一个新的文本框类型——ExpandableTextBox——然后你需要手动实现它。

这似乎也与您要查找的内容相关:http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/11dfb280-b113-4ddf-ad59-788f78d2995a

【讨论】:

以上是关于winform文本框超出的主要内容,如果未能解决你的问题,请参考以下文章

winform中文本框改为密码框

富文本框显示文字长度 超出变色

winform 文本框提示功能怎么实现

C#:在窗体中放了多个文本框,我想要在里面输入数字,但要规定它不能超出范围,若超出范围,那就要提示

可扩展的 WinForms 文本框

winform,自定义文本框控件 实现文本框验证加水印功能