C# 在文本框控件中添加标签
我想制作一个从TextBox继承的控件,它有一个标签,标签“粘”在文本框的右侧,文本不是用户可编辑的,而是由属性设置的。如何做到这一点?我意识到这个用户体验是个坏主意的原因可能有很多,但我必须这样做。我建议您创建一个C# 在文本框控件中添加标签,c#,.net,winforms,textbox,label,C#,.net,Winforms,Textbox,Label,我想制作一个从TextBox继承的控件,它有一个标签,标签“粘”在文本框的右侧,文本不是用户可编辑的,而是由属性设置的。如何做到这一点?我意识到这个用户体验是个坏主意的原因可能有很多,但我必须这样做。我建议您创建一个用户控件,使用文本框和一个标签。这应该是无痛无虫的 正如您所说,您已经使用了TextBox,为了避免太多重构,您可以将TextBox中使用的所有属性添加为“代理属性”。大概是这样的: class MyTextBox : UserControl { public int Tex
用户控件,使用文本框和一个标签。这应该是无痛无虫的
正如您所说,您已经使用了TextBox
,为了避免太多重构,您可以将TextBox中使用的所有属性添加为“代理属性”。大概是这样的:
class MyTextBox : UserControl
{
public int TextLength { get { return textbox.TextLength; } }
...
}
这可以帮助您避免很多重构 我建议您创建一个UserControl
,使用TextBox
和一个停靠在右侧的标签。这应该是无痛无虫的
正如您所说,您已经使用了TextBox
,为了避免太多重构,您可以将TextBox中使用的所有属性添加为“代理属性”。大概是这样的:
class MyTextBox : UserControl
{
public int TextLength { get { return textbox.TextLength; } }
...
}
这可以帮助您避免很多重构 我实际上会创建一个composit控件,或者简单地创建一个UserControl,然后将标签和文本框放在一起。然后,您可以删除文本框周围的边框,并用边框框将其包围,以模仿正常的文本框设计
最后,我要确保用户控件属性,如Text
映射到Textbox,这样就可以很容易地将该控件用作拖放替换。我将实际创建一个复合控件,或者简单地创建一个UserControl,并将标签和Textbox放在彼此旁边。然后,您可以删除文本框周围的边框,并用边框框将其包围,以模仿正常的文本框设计
最后,我要确保用户控件属性(如Text
)映射到文本框,因此很容易将控件用作拖放替换。根据Hans Passant的回答改编:
public class TextBoxWithLabel:TextBox{
[DllImport(“user32.dll”)]
专用静态外部IntPtr SendMessage(IntPtr hWnd、int msg、IntPtr wp、IntPtr lp);
标签=新标签();
公共文本框WithLabel(){
label.BackColor=Color.LightGray;
label.Cursor=Cursors.Default;
label.TextAlign=ContentAlignment.MiddleRight;
this.Controls.Add(标签);
}
私有int LabelWidth(){
返回textrender.MeasureText(label.Text,label.Font).Width;
}
公共字符串标签文本{
获取{return label.Text;}
设置{
label.Text=值;
SendMessage(this.Handle,0xd3,(IntPtr)2,(IntPtr)(LabelWidth()改编自Hans Passant的答案:
public class TextBoxWithLabel:TextBox{
[DllImport(“user32.dll”)]
专用静态外部IntPtr SendMessage(IntPtr hWnd、int msg、IntPtr wp、IntPtr lp);
标签=新标签();
公共文本框WithLabel(){
label.BackColor=Color.LightGray;
label.Cursor=Cursors.Default;
label.TextAlign=ContentAlignment.MiddleRight;
this.Controls.Add(标签);
}
私有int LabelWidth(){
返回textrender.MeasureText(label.Text,label.Font).Width;
}
公共字符串标签文本{
获取{return label.Text;}
设置{
label.Text=值;
SendMessage(this.Handle,0xd3,(IntPtr)2,(IntPtr)(LabelWidth()它必须从textbox继承吗?嗯…现有代码使用textbox,因此如果我可以从textbox继承,它将是一个简单的插入式替换,而无需太多重构。它必须从textbox继承吗?嗯…现有代码使用textbox,因此如果我可以从textbox继承,它将是一个简单的插入式替换,而无需太多重构uch重构。是的,但我必须将文本框的所有属性复制到usercontrol…或重构现有代码…@ian93有多少属性?这是一次性工作。你可以添加代理属性,如我在回答中所示。这并不难。我不认为有一种方法可以在usercontrol周围画一个花哨的边框,就像那些在textbox上?除了通过OnPaint滚动自己的控件外?如果是这样,则最好只使用带有成员标签的textbox。@porkchop以何种方式从textbox继承并添加控件是好的?textbox从来不是设计为容器控件的。它不会很好地工作,例如,如果您键入更多字符,它将位于标签I g后面uess。虽然不确定。抱歉,当我意识到这是c#时,我在这篇文章中删除了我的代码。不要将TB用作容器。相反,将父控件的引用传递给TB构造函数,即:(ByVal sender as control)
,然后只需将标签添加到发件人:sender.Controls.add(标签)
。抱歉,又是VB代码;pYes,但我必须将文本框的所有属性复制到usercontrol…或重构现有代码…@ian93有多少属性?这是一次性工作。您可以添加代理属性,如我在回答中所示。这并不难。我不认为有一种方法可以在usercont周围绘制花哨的边框rol,就像textbox上的控件一样?除了通过OnPaint滚动自己的控件外?如果是这样,则最好只使用带有成员标签的textbox。@porkchop从textbox继承并添加控件的方式有什么好处?textbox从来都不是设计成容器控件的。它不会很好工作,例如,如果您键入更多字符,它会变为behind我猜是标签。但不确定。抱歉,当我意识到这是c#时,我在这篇文章中删除了我的代码。不要将TB用作容器。而是将父控件的引用传递给TB构造函数,即:(ByVal sender as control)
,然后将标签添加到发件人:sender.Controls.add(标签)
。很抱歉,又是VB代码;pseems喜欢无缘无故地增加复杂性。您只需在继承的textbox类中创建一个成员标签,并设置它在构造函数中相对于textbox的位置。简单而高效。@porkchop我想您已经有了