C# 在文本框控件中添加标签

C# 在文本框控件中添加标签,c#,.net,winforms,textbox,label,C#,.net,Winforms,Textbox,Label,我想制作一个从TextBox继承的控件,它有一个标签,标签“粘”在文本框的右侧,文本不是用户可编辑的,而是由属性设置的。如何做到这一点?我意识到这个用户体验是个坏主意的原因可能有很多,但我必须这样做。我建议您创建一个用户控件,使用文本框和一个标签。这应该是无痛无虫的 正如您所说,您已经使用了TextBox,为了避免太多重构,您可以将TextBox中使用的所有属性添加为“代理属性”。大概是这样的: class MyTextBox : UserControl { public int Tex

我想制作一个从TextBox继承的控件,它有一个标签,标签“粘”在文本框的右侧,文本不是用户可编辑的,而是由属性设置的。如何做到这一点?我意识到这个用户体验是个坏主意的原因可能有很多,但我必须这样做。

我建议您创建一个
用户控件
,使用
文本框和一个
标签。这应该是无痛无虫的

正如您所说,您已经使用了
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我想您已经有了