2014-12-13 65 views
1

更新#1: 这是我所做的更改,但他们没有工作:蹊跷的使用上添加列表

1)删除静态

string date; 
string title; 
string description; 
string organizer; 
string place; 

2)使坦佩当地

events tempe = new events(); 
tempe.setDate(event_info[0]); 
tempe.setTitle(event_info[1]); 
tempe.setPlace(event_info[2]); 
tempe.setDesc(event_info[3]); 
tempe.setOrganizer(event_info[4]); 
eventsarray.Add(tempe); 
tempe = null; 

3)使用列表直接

eventsarray.Add(new events()); 
eventsarray[eventsarray.Count - 1].setDate(event_info[0]); 
eventsarray[eventsarray.Count - 1].setTitle(event_info[1]); 
eventsarray[eventsarray.Count - 1].setPlace(event_info[2]); 
eventsarray[eventsarray.Count - 1].setDesc(event_info[3]); 
eventsarray[eventsarray.Count - 1].setOrganizer(event_info[4]); 

原来的问题

我想事件的列表保存到列表中,但是当我尝试添加新的事件,事件列表中的所有其他情况下也得到了由取代上次输入。 下面的代码包含通过使用.Add将新事件存储到列表中的过程,该过程由3组代码提供输出以用于调试。

if (eventsarray.Count > 0) 
{ 
    richTextBox1.Text = richTextBox1.Text + "Before Insert: \r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray.Count: " + eventsarray.Count.ToString() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[0].getDate: " + eventsarray[0].getDate() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[0].getTitle: " + eventsarray[0].getTitle() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[0].getPlace: " + eventsarray[0].getPlace() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[0].getDesc: " + eventsarray[0].getDesc() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[0].getOrganizer: " + eventsarray[0].getOrganizer() + "\r\n\r\n"; 
} 


//store all into into a new event in eventsarray 

tempe.setDate(event_info[0]); 
tempe.setTitle(event_info[1]); 
tempe.setPlace(event_info[2]); 
tempe.setDesc(event_info[3]); 
tempe.setOrganizer(event_info[4]); 
//something is wrong with .Add? 
eventsarray.Add(tempe); 


if (eventsarray.Count > 0) 
{ 
    richTextBox1.Text = richTextBox1.Text + "After Insert: \r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray.Count: " + eventsarray.Count.ToString() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[0].getDate: " + eventsarray[0].getDate() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[0].getTitle: " + eventsarray[0].getTitle() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[0].getPlace: " + eventsarray[0].getPlace() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[0].getDesc: " + eventsarray[0].getDesc() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[0].getOrganizer: " + eventsarray[0].getOrganizer() + "\r\n\r\n"; 
} 
richTextBox1.Text = richTextBox1.Text + "eventsarray.Count: " + eventsarray.Count.ToString() + "\r\n"; 
richTextBox1.Text = richTextBox1.Text + "Event " + event_info[1] + " has been added to List." + "\r\n\r\n"; 

for (int i = 0; i < eventsarray.Count; i++) 
{ 
    richTextBox1.Text = richTextBox1.Text + "Looping: "+ i.ToString() + "\r\n" ; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray.Count: " + eventsarray.Count.ToString() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[i].getDate: " + eventsarray[i].getDate() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[i].getTitle: " + eventsarray[i].getTitle() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[i].getPlace: " + eventsarray[i].getPlace() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[i].getDesc: " + eventsarray[i].getDesc() + "\r\n"; 
    richTextBox1.Text = richTextBox1.Text + "eventsarray[i].getOrganizer: " + eventsarray[i].getOrganizer() + "\r\n\r\n"; 
} 

并且输出是这样的(第一事件的输入和第二事件是不同的):

Output of the for loop

。新增的代码之前,它仍然是完全没有问题。我尝试使用断点来查看是否有任何循环而不是使行运行两次,但它只运行一次。我尝试使用.Insert(0,eventsarray),但问题仍然存在,并且输出完全相同。有人有什么主意吗?谢谢。

+0

你如何声明和初始化变量_tempe_? – Steve 2014-12-13 16:27:58

+0

也许* static *是不必要的。 – Ripple 2014-12-13 16:29:58

+0

以前不是'tempe'吗?我想这个列表有两次相同的参考。 – 2014-12-13 16:30:20

回答

1

问题可能,当你改变坦佩变量的值来解释,如果变量tempe是初始化只是一个时间一个全局变量(可能在某些时候,加之前)

如果是这种情况,您可以更改前面添加中引用的同一个对象。更改这些值不会创建tempe类型的另一个实例。当您重新进行添加第二个时间变量坦佩你有两个项目阵列中,但都引用同一个对象与在上次更新应用的值存储

要解决,你只需要:

// This creates a new instance of an Events 
Events tempe = new Events(); 

tempe.setDate(event_info[0]); 
tempe.setTitle(event_info[1]); 
tempe.setPlace(event_info[2]); 
tempe.setDesc(event_info[3]); 
tempe.setOrganizer(event_info[4]); 
eventsarray.Add(tempe); 

从这个部分是另一个错误。代码tempe.setDate(event_info[0]);似乎设置为事件类定义的STATIC变量date。静态变量在类的所有实例之间共享。因此,即使您创建了新的局部变量Events,将STATIC日期结果设置为Events类型的所有变量也具有相同的值。

您需要将这些静态变量更改为实例成员。

public class Events 
{ 
    private string date; 
    private string title; 
    private string description; 
    private string organizer; 
    private string place; 

    public void setDate(string newValue) 
    { 
     date = newValue; 
    } 
    .... other set methods.... 
} 

或改变一切,并用getter和setter使用公共属性访问器

public class Events 
{ 
    public string Date {get; set;} 
    public string Title {get; set;} 
    public string Description {get; set;} 
    public string Organizer {get; set;} 
    public string Place {get; set;} 
} 

.... 
// This creates a new instance of an Events 
Events tempe = new Events(); 
tempe.Date = event_info[0]; 
.....