对象值更改

时间:2016-03-29 06:11:54

标签: c#

我在维持对象状态时遇到了问题。

我有一个结构如下;

public struct myStruct
{
    public String ViewType;
    public object objCB;
}

//在程序中使用struct类型

List<myStruct> mylist; //Global list

myStruct mystr; //Global struct object

在其中一个事件函数中,我按如下方式填充此struct对象;

private void onClick(object sender, EventArgs e)
{
    mystr = new MyStruct();
    mystr.objCB = sender; //filling object value in struct object
}

然后在另一个方法中,我将这个struct对象插入一个列表中:

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    mystr.ViewType = (rbLine.IsChecked == true) ? "SingleLine" : "Area";
    mylist.Add(mystr);
}

问题是,每当调用objCB时,我在列表中的上一个onClick event值都会更改(原因可能是我在sender object中引用了list

我尝试用MemberWiseCopy克隆一个对象,但它仍然存在同样的问题。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

声明静态变量obj,

Object obj;

将onclick事件更新为,

private void onClick(object sender, EventArgs e)
{ 
   obj=sender;
}

保存操作,

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    myStruct mystr=new myStruct();//local variable
    mystr.objCB = obj;
    mystr.ViewType = (rbLine.IsChecked == true) ? "SingleLine" : "Area";
    mylist.Add(mystr);
    objCB=null;
}

答案 1 :(得分:0)

您的代码有效。我创造了这个:

public struct MyStruct
{
    public String ViewType;
    public object objCB;
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    List<MyStruct> mylist = new List<MyStruct>(); //Global list

   MyStruct mystr; //Global struct object

    public MainWindow()
    {
        InitializeComponent();
    }

    private void ButtonBase1_OnClick(object sender, RoutedEventArgs e)
    {
        mystr = new MyStruct();
        mystr.objCB = sender; //filling object value in struct object
    }


    private void Save_OnClick(object sender, RoutedEventArgs e)
    {
        mylist.Add(mystr);
    }
}

我有三个按钮连接到ButtonBase1_OnClick和一个保存按钮。当我点击button1保存button2保存button3保存我在列表中得到三个mystruct对象,引用了button1,button2和button3。我认为你得到失败的唯一方法是使用以下代码:

public class MyStruct
{
    public String ViewType;
    public object objCB;
}
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    List<MyStruct> _mylist = new List<MyStruct>(); //Global list

    MyStruct _mystr = new MyStruct(); //Global struct object

    public MainWindow()
    {
        InitializeComponent();
    }

    private void ButtonBase1_OnClick(object sender, RoutedEventArgs e)
    {
        _mystr.objCB = sender; //filling object value in struct object
    }


    private void Save_OnClick(object sender, RoutedEventArgs e)
    {
        _mylist.Add(_mystr);
    }
}

答案 2 :(得分:-1)

您对所有项目使用相同的对象引用,因此它会将旧值更改为最新值。

由于您要将值填充到两个事件处理程序中,因此您有一个声明变量的问题,这就是您在所有事件之外声明它的原因。

由于您只是将项目添加到列表的末尾,因此最好是:

private void onClick(object sender, EventArgs e)
{
        mylist.Add(new myStruct(){objCB = sender});
}

private void btnSave_Click(object sender, RoutedEventArgs e)
{
        myStruct lastItem = mylist.Last();
        lastItem.ViewType = (rbLine.IsChecked == true) ? "SingleLine" : "Area";
}

....评论后编辑....

将新属性添加到结构bool AddedStatus。默认值为false。在完成btnSave_Click处理后,将此属性更改为true。

onClick内,从列表中提取最后一项并检查其AddedStatus值,如果值为False,则删除此项。

private void onClick(object sender, EventArgs e)
{
        myStruct lastItem = mylist.Last();
        if(myStruct != null && myStruct.AddedStatus == false)
            mylist.Remove(lastItem);

        mylist.Add(new myStruct(){objCB = sender, AddedStatus = false});
}

private void btnSave_Click(object sender, RoutedEventArgs e)
{
        myStruct lastItem = mylist.Last();            
        lastItem.ViewType = (rbLine.IsChecked == true) ? "SingleLine" : "Area";
        lastItem.AddedStatus = true;
}