我在维持对象状态时遇到了问题。
我有一个结构如下;
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
克隆一个对象,但它仍然存在同样的问题。
我该如何解决这个问题?
答案 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;
}