C# 如何将代码生成的控件传递给另一个方法

C# 如何将代码生成的控件传递给另一个方法,c#,methods,C#,Methods,感谢所有愿意花时间看/回答这个问题的人 实际上,我很难通过我在该方法中添加的控件: private void btn_AddAuthor_Click(object sender, EventArgs e) { Button cbtn_CreateNewAuthor = new Button(); Label clbl_AuthorName = new Label(); TextBox ctb_AuthorNa

感谢所有愿意花时间看/回答这个问题的人

实际上,我很难通过我在该方法中添加的控件:

private void btn_AddAuthor_Click(object sender, EventArgs e)
        {
            Button cbtn_CreateNewAuthor = new Button();
            Label clbl_AuthorName = new Label();
            TextBox ctb_AuthorName = new TextBox();
            Label clbl_AuthorLastName = new Label();
            TextBox ctb_AuthorLastName = new TextBox();

            // The first name
            clbl_AuthorName.Text = "Prénom de l'Auteur :";
            clbl_AuthorName.AutoSize = false;
            clbl_AuthorName.Height = 20;
            clbl_AuthorName.Width = 100;
            flp_AddNewThings.Controls.Add(clbl_AuthorName);
            flp_AddNewThings.Controls.Add(ctb_AuthorName);
            flp_AddNewThings.SetFlowBreak(ctb_AuthorName, true);

            // the Last Name
            clbl_AuthorLastName.Text = "Nom de l'Auteur";
            clbl_AuthorName.AutoSize = false;
            clbl_AuthorName.Height = 20;
            clbl_AuthorName.Width = 100;
            flp_AddNewThings.Controls.Add(clbl_AuthorLastName);
            flp_AddNewThings.Controls.Add(ctb_AuthorLastName);
            flp_AddNewThings.SetFlowBreak(ctb_AuthorLastName, true);

            //The Button
            cbtn_CreateNewAuthor.Text = "Nouvel Auteur";
            cbtn_CreateNewAuthor.Click += new System.EventHandler(cbtn_CreateNewAuthor_Click);
            flp_AddNewThings.Controls.Add(cbtn_CreateNewAuthor);

        }
对于另一个,我想使用其中包含的内容来排序Author对象:

private void cbtn_CreateNewAuthor_Click(object sender, EventArgs e)
{
    using (var db = new ProgramContext())
    {

    }
}
当然,如果你有更好的方法来处理这个问题,我会非常乐意考虑的。p> 多亏了James,我成功地完成了第二个类,因为flp_AddNewThings.Controls中没有SingleOrDefault,所以我把它放在那里:

private void cbtn_CreateNewAuthor_Click(object sender, EventArgs e)
{
    using (var db = new ProgramContext())
    {
        // First we create a list of the flow layout panel controls and add the controls to it
        List<Control> AllControls = new List<Control>();
        foreach (Control c in flp_AddNewThings.Controls)
        {
            AllControls.Add(c);
        }

        // Then we take the controls we need
        var txtFirstName = AllControls.SingleOrDefault(x => x.Tag == "txtFirstName");
        var txtLastName = AllControls.SingleOrDefault(x => x.Tag == "txtLastName");

        // if the two above arent null, we go on :
        var author = new Author();
        if (txtFirstName != null && txtLastName != null)
        {
            // We make sure there's actually a name and last name entered
            if (txtFirstName.Text == "" && txtLastName.Text == "")
            {
                author.FirstName = txtFirstName.Text;
                author.LastName = txtLastName.Text;
            }
            else // else we make the person aware it's needed
            {
                if (txtFirstName.Text == "") flp_AddNewThings.Controls.Add(new Label{ Text = "Vous devez ajouter un Prénom"});
                if (txtLastName.Text == "") flp_AddNewThings.Controls.Add(new Label { Text = "Vous devez ajouter un Nom de Famille" });
            }

            // On vérifie que l'auteur n'est pas dans la bd

            var AutorOk = db.Authors.Any(x => x.LastName == author.LastName && x.FirstName == author.FirstName);
            if (AutorOk)
            {
                db.Authors.Add(author);
                db.SaveChanges();

                // Display all Authors from the database 
                var query = from b in db.Authors
                            orderby b.DisplayName
                            select b;

                LogBox.Text = "Auteurs Connus : \n";
                foreach (var item in query)
                {
                    LogBox.AppendText(item.DisplayName + "\n");
                }
            }

        }
    }

}
private void cbtn\u CreateNewAuthor\u单击(对象发送方,事件参数e)
{
使用(var db=new ProgramContext())
{
//首先,我们创建一个流布局面板控件的列表,并将这些控件添加到其中
List AllControls=新列表();
foreach(flp_AddNewThings.Controls中的控件c)
{
添加(c);
}
//然后我们采取我们需要的控制措施
var txtFirstName=AllControls.SingleOrDefault(x=>x.Tag==“txtFirstName”);
var txtLastName=AllControls.SingleOrDefault(x=>x.Tag==“txtLastName”);
//如果上述两个值不为空,我们继续:
var author=新作者();
if(txtLastName!=null&&txtLastName!=null)
{
//我们确保输入了一个名字和姓氏
if(txtLastName.Text==“”&txtLastName.Text==“”)
{
author.FirstName=txtFirstName.Text;
author.LastName=txtLastName.Text;
}
否则//否则我们会让人意识到这是必要的
{
if(txtFirstName.Text==“”)flp_AddNewThings.Controls.Add(新标签{Text=“Vous-devez-ajour-Prénom”});
如果(txtLastName.Text==“”)flp_AddNewThings.Controls.Add(新标签{Text=“Vous-devez-ajour-Nom-de-Famille”});
}
//关于导演的故事
var AutorOk=db.Authors.Any(x=>x.LastName==author.LastName&&x.FirstName==author.FirstName);
如果(自动确定)
{
db.Authors.Add(author);
db.SaveChanges();
//显示数据库中的所有作者
var query=来自db.Authors中的b
orderby b.DisplayName
选择b;
LogBox.Text=“Auteurs Connus:\n”;
foreach(查询中的var项)
{
LogBox.AppendText(item.DisplayName+“\n”);
}
}
}
}
}

如果一次只能添加一个作者,那么类引用将是最简单的方法

private TextBox ctb_AuthorName;
private TextBox ctb_AuthorLastName;
...
this.ctb_AuthorName = new TextBox();
this.ctb_AuthorLastName = new TextBox();
...

private void cbtn_CreateNewAuthor_Click(object sender, EventArgs e)
{
    using (var db = new ProgramContext())
    { 
        var author = new Author(ctb_AuthorName.Text, ctb_AuthorLastName.Text);
        ...
    }
}
或者,您可以从
FlowLayoutPanel
中的
控件
集合中查找控件。您可以使用
标记
属性为每个控件指定一个唯一标识符,例如:

TextBox ctb_AuthorName = new TextBox();
ctb_AuthorName.Tag = "txtForename";
TextBox ctb_AuthorLastName = new TextBox();
ctb_AuthorLastName.Tag = "txtSurname";
然后在
cbtn\u CreateNewAuthor\u单击事件中,使用这些标记查找控件

private Control FindControlByTag(Control.ControlCollection controls, string tag)
{
    Control result = null;
    foreach (var ctrl in controls)
    {
        if (ctrl.Tag == tag)
        {
            result = ctrl;
            break;
        }
    }
    return result;
}

private void cbtn_CreateNewAuthor_Click(object sender, EventArgs e)
{
    using (var db = new ProgramContext())
    {
        var txtForename = FindControlByTag(flp_AddNewThings.Controls, "txtForename");
        var txtSurname = FindControlByTag(flp_AddNewThings.Controls, "txtSurname");
        if (txtForename != null && txtSurname != null)
        {
            var author = new Author(txtForename.Text, txtSurname.Text);
            ...
        }
    }
}
您可以更进一步,将
FindControlByTag
方法作为
ControlCollection

public static class ControlCollectionExt
{
    public static Control FindByTag(this Control.ControlCollection controls, string tag)
    {
        Control result = null;
        foreach (var ctrl in controls)
        {
            if (ctrl.Tag == tag)
            {
                result = ctrl;
                break;
            }
        }
        return result;
    }
}
这将使您的代码减少到

var txtForename = flp_AddNewThings.Controls.FindByTag("txtForename");
var txtSurname = flp_AddNewThings.Controls.FindByTag("txtSurname");

如果你需要在另一个方法中再次引用它们,你能不能不简单地让它们成为类成员变量?嗯,我对编程比较陌生,所以我没有想到这个想法。我以为那个班的成员会一直留在记忆里,而我只是暂时需要他们…什么是flp_添加的新东西?我的意思是哪个控件??它是一个流布局面板。除了James建议的标记属性外,您还可以像这样使用GetEnumerator()方法-flowlayoutpanel.Controls.GetEnumerator()非常感谢您的回答!看到标签如何使用也很好!但是,flp_AddNewThings.Controls上没有SingleOrDefault,所以我在解决方案中添加了我自己的方法。@Ukyuu啊,这是我的错误,不支持
IEnumerable
,因此不支持LINQ扩展。或者,
ControlCollection
类有自己的方法,但这会检查
Name
属性,而不是
标记。我将更新我的答案。@Ukyuu请参阅更新。我看到了你的代码,这会起作用,但是,仅仅为LINQ扩展创建一个全新的列表似乎很愚蠢,一个
foreach
循环也会很快。我正在尝试你的静态类,但似乎我错过了某种用法,我不知道如何让它起作用。。。
var txtForename = flp_AddNewThings.Controls.FindByTag("txtForename");
var txtSurname = flp_AddNewThings.Controls.FindByTag("txtSurname");