如何设置WindowsForms TextBox的垂直对齐方式?

时间:2016-06-30 05:31:53

标签: c# winforms vertical-alignment

在WPF中,它具有TextBox控件垂直对齐的默认支持。但在Windows窗体中,无法设置TextBox控件的垂直对齐方式。

在我的情况下,我使用多行文本框,文本需要显示在TextBox的底部,并且需要在键入时保持对齐。

我试图获取输入文本的行数,并尝试根据文本的长度计算文本框的边界。但是在使用自动换行编辑文本时,行数不正确。

enter image description here

任何人都可以帮我解决这个问题,以便在编辑时保持TextBox的垂直对齐吗?

我尝试使用该主题中给出的建议更改文本框的位置。在编辑文本时。当我尝试编辑文本时,边界未正确更新,文本的某些部分隐藏在文本框中。我根据字体大小和文本宽度计算了边界。

tsc

编辑文本时工作正常,但在某些情况下,Size textSize = TextRenderer.MeasureText(TextBoxText, this.textBoxControl.Font); int textBoxTop = this.textBoxControl.Bounds.Top; int nol = (textSize.Width > this.textBoxControl.Width) ? ((textSize.Width) / this.textBoxControl.Width) + 1 : 1; { if (nol > n) { n = nol; rect1 = this.textBoxControl.Bounds; if (top + (height - nol * textSize.Height) > top) { rect1.Y = top + (height - nol * textSize.Height); rect1.Height = nol * textSize.Height; this.textBoxControl.Bounds = rect1; } else { this.textBoxControl.Bounds = rect1; } } else if (nol < n) { n = nol; rect1 = this.textBoxControl.Bounds; if (rect1.Y + nol * textSize.Height < top + height) { rect1.Y += textSize.Height - this.textBoxControl.Margin.Top; rect1.Height -= textSize.Height; //this.textBoxControl.Bounds = rect1; } if (nol == 1) { rect1.Y = top + height - textSize.Height; rect1.Height = textSize.Height; //this.textBoxControl.Bounds = rect1; } this.textBoxControl.Bounds = rect1; } } 行计数错误计算。如何获取文本框的实际行数,包括换行。

2 个答案:

答案 0 :(得分:1)

我创建了一个控件,其TextBox停靠在面板底部,看起来有点像// Make sure you have this. using System.Linq; public class BottomAlignTextBox : Panel { public BottomAlignTextBox() { this.BackColor = Color.White; this.BorderStyle = (Application.RenderWithVisualStyles) ? BorderStyle.FixedSingle : BorderStyle.Fixed3D; this.Size = new Size(200, 200); this.Padding = new Padding(5, 0, 4, 2); bottomAlignTextBox.Dock = DockStyle.Bottom; bottomAlignTextBox.Multiline = true; bottomAlignTextBox.WordWrap = true; bottomAlignTextBox.AcceptsReturn = true; bottomAlignTextBox.BorderStyle = BorderStyle.None; bottomAlignTextBox.Height = 20; bottomAlignTextBox.TextChanged += delegate { if (bottomAlignTextBox.Height < this.Height - 20) { if (TextRenderer.MeasureText(bottomAlignTextBox.Text, bottomAlignTextBox.Font).Width > bottomAlignTextBox.Width + 6) { string longestLine = bottomAlignTextBox.Lines.OrderByDescending(s => TextRenderer.MeasureText(s, bottomAlignTextBox.Font).Width).First(); bottomAlignTextBox.Text = bottomAlignTextBox.Text.Replace(longestLine, longestLine.Substring(0, longestLine.Length - 1) + Environment.NewLine + longestLine[longestLine.Length - 1]); bottomAlignTextBox.Height += 19; bottomAlignTextBox.SelectionStart = bottomAlignTextBox.Text.Length + 2; bottomAlignTextBox.SelectionLength = 0; } } }; this.Controls.Add(bottomAlignTextBox); this.Click += delegate { bottomAlignTextBox.Focus(); }; } public new string Text { get { return bottomAlignTextBox.Text; } set { bottomAlignTextBox.Text = value; } } private TextBox bottomAlignTextBox = new TextBox(); }

select t1.*
from yourtable t1
inner join (
    select max(`sale_Amnt(INR)`) as `sale_Amnt(INR)`, product_group 
    from yourtable
    group by product_group
) t2 on t2.product_group = t1.product_group and t2.`sale_Amnt(INR)` = t1.`sale_Amnt(INR)`

答案 1 :(得分:0)

我不确定这是否完全可能,但我认为您可以使用Panel控件或某种类型包装控件并将其停靠在包装Panel控件的底部?如果大小需要是动态的,那么围绕Anchor属性玩游戏也应该有效。