Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用构造函数填充列表会覆盖以前的信息_C#_List_Constructor - Fatal编程技术网

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)

我对C#还是相当陌生,所以我不知道它有什么可能性

我的代码:

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点,我有更多详细的代码。我下次会发布。人们可能会理解,但它是用另一种语言编写的。这里的快速帮助确实鼓励人们继续。