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");