C# 从类对象向窗体添加面板控件

C# 从类对象向窗体添加面板控件,c#,winforms,C#,Winforms,我对C#还是有点生疏,所以如果我问错了问题,请原谅我 我正在写一个windows窗体程序。我有一个表单,上面有一个选项卡控件。其中一个选项卡上的选项卡控件内部是FlowlayoutPanel控件 我有一个具有各种属性的类。此类表示联系人卡上的数据,即姓名地址、电话等,其设计类似于面板控件。下面是一些代码: public class clsContactCard { #region Fields (8)  private Color _backColour; private Bo

我对C#还是有点生疏,所以如果我问错了问题,请原谅我

我正在写一个windows窗体程序。我有一个表单,上面有一个选项卡控件。其中一个选项卡上的选项卡控件内部是FlowlayoutPanel控件 我有一个具有各种属性的类。此类表示联系人卡上的数据,即姓名地址、电话等,其设计类似于面板控件。下面是一些代码:

public class clsContactCard
{
#region Fields (8) 

    private Color _backColour;
    private BorderStyle _borderStyle;
    private List<string> _detailLines = new List<string>();
    private Color _foreColour;
    private Size _size;
    private string _subTitle;
    private string _title;

#endregion Fields 

#region Constructors (1) 

    public clsContactCard()
    {}

#endregion Constructors 

#region Properties (8) 

    public Color BackColour
    {
        get { return _backColour; }
        set { _backColour = value; }
    }

    public BorderStyle BorderStyle
    {
        get { return _borderStyle; }
        set { _borderStyle = value; }
    }

    public List<string> DetailLines
    {
        get { return _detailLines; }
        set { _detailLines = value; }
    }

    public Color ForeColour
    {
        get { return _foreColour; }
        set { _foreColour = value; }
    }

    public Size Size
    {
        get { return _size; }
        set { _size = value; }
    }

    public string SubTitle
    {
        get { return _subTitle; }
        set { _subTitle = value; }
    }

    public string Title
    {
        get { return _title; }
        set { _title = value; }
    }

#endregion Properties 

    public Panel CreateCard()
    {
        // New Contact Card  
        Point labelLoc = new Point(18, 11);             //Location for a label
        Size labelSize = new Size(218, 16);             //default label size

        Panel pnl = new Panel();                        //Instantiate a new Panel
        pnl.BackColor = _backColour;                    //Set the new panel's properties
        pnl.BorderStyle = _borderStyle;
        pnl.Size = _size;
        pnl.Visible = true;

        //Title
        Label l = new Label();                          //Create new label object
        l.Name = "uxTitle";                             //Give it a name
        l.Text = _title;                                //Assign it data from properties
        l.Size = labelSize;                             //set its size & font
        l.Font = new Font("Microsoft Sans Serif",10,FontStyle.Bold);
        l.Location = labelLoc;                          //set its location
        labelLoc.Y += labelSize.Height;                 //update next labels location
        pnl.Controls.Add(l);                            //add label to panel controls

        //Type
        //Label l = new Label();
        l.Name = "uxSubTitle";
        l.Text = _subTitle;
        l.Size = new Size(215, 15);
        l.Font = new Font("Microsoft Sans Serif",7,FontStyle.Regular);
        l.Location = new Point(21, 27);
        labelLoc.Y += labelSize.Height + 5;

        //Detail lines
        int lineCount = 0;
        bool firstPhone = true;

        foreach (string line in _detailLines)
        {
            if (SAPSCommon.Instance.IsNumeric(line.Trim()) && firstPhone)
            {
                firstPhone = false;
                labelLoc.Y += 5;
            }
            lineCount += 1;
            //Label l = new Label();
            l.Name = "uxLine" + lineCount;
            l.Text = line;
            l.Size = labelSize;
            l.Font = new Font("Microsoft Sans Serif",8,FontStyle.Regular);
            l.Location = labelLoc;
            labelLoc.Y += labelSize.Height + 5;
        }
        return pnl;
    }
}

谁能告诉我我做错了什么以及如何纠正它?我认为可以将面板控件添加到flowlayout面板。

您不能向容器控件添加任何其他控件,如FlowLayoutPanel。您应该添加面板本身,而不是卡对象。这样做:

Panel pnl = card.CreateCard();
pnl.Tag = card; //optional
uxContactDetsFlp.Controls.Add(pnl);

此外,如果以后必须检索卡片对象,则可以用卡片对象标记面板。

不能向容器控件添加任何其他控件,如FlowLayoutPanel。您应该添加面板本身,而不是卡对象。这样做:

Panel pnl = card.CreateCard();
pnl.Tag = card; //optional
uxContactDetsFlp.Controls.Add(pnl);

此外,如果以后必须检索卡对象,则可以用卡对象标记面板。

这不起作用,因为您没有从控件继承类。您只能将从控件继承的类添加到控件集合中,如Panel.Controls等

public class clsContactCard : Control
因此,需要重写OnPaint事件处理程序以将内容呈现到自定义面板

发件人:

如果要创建在Windows上使用的完全自定义控件 窗体,则应该从控件类继承

您还可以继承面板控件并覆盖其OnPaint,以使生活更轻松

更新-以下是一些资源:





这不起作用,因为您没有从控件继承类。您只能将从控件继承的类添加到控件集合中,如Panel.Controls等

public class clsContactCard : Control
因此,需要重写OnPaint事件处理程序以将内容呈现到自定义面板

发件人:

如果要创建在Windows上使用的完全自定义控件 窗体,则应该从控件类继承

您还可以继承面板控件并覆盖其OnPaint,以使生活更轻松

更新-以下是一些资源:





感谢所有提供建议的人。大部分都在我的头顶上,但我确实仔细看了看。最后我听从了纳瓦尔的建议。我重新阅读了代码,发现没有将
CreateCard
方法生成的面板对象分配给任何对象。我想使用card对象创建的Panel对象来填充flowlayoutpanel,而不是card对象本身(愚蠢的我)。因此,我真正需要做的唯一更改是
PopulateContactDetails
方法末尾的这个小代码段:


谢谢大家的建议。大部分都在我的头顶上,但我确实仔细看了看。最后我听从了纳瓦尔的建议。我重新阅读了代码,发现没有将
CreateCard
方法生成的面板对象分配给任何对象。我想使用card对象创建的Panel对象来填充flowlayoutpanel,而不是card对象本身(愚蠢的我)。因此,我真正需要做的唯一更改是
PopulateContactDetails
方法末尾的这个小代码段:


你需要在面板中添加一个控件,就像你在控件中添加你的类一样,根据你的布局,你可以使用一个带有say文本框的usercontrol来填写你的类的详细信息,这些信息将显示在你的面板上。与论坛网站不同,我们不使用“谢谢”或“感谢任何帮助”或签名。看见“。请只发布有问题的部分。浏览整个代码很麻烦。为不必要的代码道歉。我不确定需要多少来说明我的问题。还感谢大家对问候语的介绍。@V4Vendetta:嗯……我想我就是这么做的,用标签对象创建了一个面板对象,其中包含面板上适当位置的数据。然后将该面板添加到要显示的flowlayoutpanel。最初我在flp上有一个不可见的面板,我克隆了它,然后填充了标签控件,问题是有时一些标签是空白的,不应该显示,因此我采用了新的类/对象方法。我猜我不理解对象、类和控件的草根概念。你需要在面板中添加一个控件,就像你在控件中添加类一样,根据你的布局,你可以使用一个带有say文本框的usercontrol来填写你的类的详细信息,这些信息将显示在你的面板中不同于论坛站点,我们不使用“谢谢”或“感谢任何帮助”或签名。看见“。请只发布有问题的部分。浏览整个代码很麻烦。为不必要的代码道歉。我不确定需要多少来说明我的问题。还感谢大家对问候语的介绍。@V4Vendetta:嗯……我想我就是这么做的,用标签对象创建了一个面板对象,其中包含面板上适当位置的数据。然后将该面板添加到要显示的flowlayoutpanel。最初我在flp上有一个不可见的面板,我克隆了它,然后填充了标签控件,问题是有时一些标签是空白的,不应该显示,因此我采用了新的类/对象方法。我想我不理解对象、类和控制的草根概念。这是一个创新的想法,但我不推荐它。clsContactCard是一种控制,因为狗是哺乳动物吗?不,所以最好不要继承。这可能是一个糟糕的设计选择。这听起来似乎可行,但对我有限的知识来说有点复杂。我将通过继承面板控件来尝试它。不知道我是怎么想的