C# 使用构造函数填充列表会覆盖以前的信息
我对C#还是相当陌生,所以我不知道它有什么可能性 我的代码:C# 使用构造函数填充列表会覆盖以前的信息,c#,list,constructor,C#,List,Constructor,我对C#还是相当陌生,所以我不知道它有什么可能性 我的代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } Test ctest = new Test(); private void button1_Click(object sender, EventArgs e)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Test ctest = new Test();
private void button1_Click(object sender, EventArgs e)
{
ctest.name = Convert.ToString(textBox1.Text);
MessageBox.Show(ctest.name);
ctest.namelist.Add(ctest);
listBox1.DataSource = null;
listBox1.DataSource = ctest.namelist;
}
}
class Test
{
private string Name;
public string name
{
get { return Name; }
set { Name = value; }
}
public List<Test> namelist = new List<Test>();
public override string ToString()
{
string spaceinbetween = new string(' ', 3);
return name + spaceinbetween + name;
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
测试ctest=新测试();
私有无效按钮1\u单击(对象发送者,事件参数e)
{
ctest.name=Convert.ToString(textBox1.Text);
MessageBox.Show(ctest.name);
ctest.namelist.Add(ctest);
listBox1.DataSource=null;
listBox1.DataSource=ctest.namelist;
}
}
课堂测试
{
私有字符串名称;
公共字符串名
{
获取{返回名称;}
设置{Name=value;}
}
公共列表名称列表=新列表();
公共重写字符串ToString()
{
字符串空格中间=新字符串(“”,3);
返回name+spaceinbetween+name;
}
我想做的是:
因此,我想使用我的构造函数用信息(本例中的名称)填充我的列表框。但是,在添加两个以上的名称后,它会覆盖以前的值
我假设这是错误的,因为类对象名被覆盖,并在添加的两行中使用
问题:添加新名称是否不会改变以前的列表值,或者是否有任何方法可以在我想要创建新ctest时创建构造函数的新实例?如果我没有误解您的问题,有很多事情需要更改以使表单正常工作:
public partial class Form1 : Form
{
// BindingList is perfect here... istead of List. It automatically refreshes upon change.
private BindingList<Test> m_Tests;
public Form1()
{
InitializeComponent();
m_Tests = new BindingList<Test>();
listBox1.DataSource = m_Tests;
// DisplayMember and ValueMember should be defined too here.
}
private void button1_Click(object sender, EventArgs e)
{
// Create a new instance every time the button is clicked.
// Since textBox1.Text is already a String... no need to convert it!
// Thanks to BindingList, you don't need to refresh your binding...
m_Tests.Add(new Test(textBox1.Text));
}
}
public class Test
{
private String m_Name;
public String Name
{
get { return m_Name; }
set { m_Name = value; }
}
public Test(String name)
{
m_Name = name;
}
public override String ToString()
{
if (String.IsNullOrWhiteSpace(m_Name))
return "NO NAME";
return (m_Name + " " + m_Name);
}
}
公共部分类表单1:表单
{
//BindingList在这里非常完美…它是列表的一部分。它会在更改时自动刷新。
私有绑定列表m_测试;
公共表格1()
{
初始化组件();
m_Tests=新绑定列表();
listBox1.DataSource=m_测试;
//这里也应该定义DisplayMember和ValueMember。
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
//每次单击按钮时创建一个新实例。
//因为textBox1.Text已经是一个字符串…不需要转换它!
//感谢BindingList,您无需刷新绑定。。。
添加(新测试(textBox1.Text));
}
}
公开课考试
{
私有字符串m_Name;
公共字符串名
{
获取{return m_Name;}
设置{m_Name=value;}
}
公共测试(字符串名称)
{
m_Name=名称;
}
公共重写字符串ToString()
{
if(String.IsNullOrWhiteSpace(m_Name))
返回“没有名字”;
返回(m_Name+“”+m_Name);
}
}
让我们总结一下我的变化:
测试
类的一部分,而应该是表单1
的一部分。从面向对象的角度来看,应该在这里正确添加和管理新实例ListBox
控件,因此最好使用bindingslist
(参考)。它正是为此目的而创建的,可以自动处理更改Form1
构造函数时,可以初始化BindingList
,并且必须在同一上下文中定义它与ListBox
控件的链接。不要忘记对listBox1.DisplayMember
和listBox1.ValueMember
属性进行赋值,以便设置正确的disp基本数据的层次测试类实例,其名称由textBox1.Text
定义,并将其添加到绑定列表中
Form1
类中创建了一个Test
类实例,因此每次单击按钮时,您都试图添加完全相同的实例……这基本上没有产生任何结果Test
类定义一个接受名称作为参数的自定义构造函数,以便于创建新实例Test.ToString()
重写以避免出现问题变量ctest仅初始化一次。然后每次单击按钮时都将此变量添加到内部列表中,但它始终是同一个变量。当您更改name属性时,您始终更改相同的属性,并且您的列表始终显示相同的名称是,问题是我想创建一个新的人员并将其添加到e列表。但是,这也需要我创建一个新的测试实例,除了添加一个新实例的代码外,我不能这样做。我实际上想在应用程序启动后手动添加它。你的代码中没有构造函数。你说的构造函数是什么意思?谢谢!我在这个问题上坚持了至少一天。这非常有效对我想做的事情很满意。我将查找更多关于这些绑定列表的信息,因为我还不知道它们。自我说明:我将来可能会更清楚我的问题。别担心,你有时间学习。同时,我编辑了我的答案,对其进行了一点改进。事实上,这有助于分配!关于第7点,我有更多详细的代码。我下次会发布。人们可能会理解,但它是用另一种语言编写的。这里的快速帮助确实鼓励人们继续。