gpt4 book ai didi

c# - 当 BindingList 中的现有项目发生更改时,列表框拒绝更新

转载 作者:行者123 更新时间:2023-11-30 19:48:16 26 4
gpt4 key购买 nike

一天中的大部分时间我都在发疯,试图让这个工作正常进行。

我的代码中有几个类。我会尽量在下面贴出相关代码,并尽可能简短

public class ServerSettings
{
private BindingList<Server> serverList = new BindingList<Server>();

public ServerSettings()
{

}

private void readSettings()
{
string list = "/Settings/Server";
XmlNodeList Xn = settings.SelectNodes(list);

foreach (XmlNode xNode in Xn)
{
Server tmpSrv = new Server();
for (int i=0; i<xNode.ChildNodes.Count; i++)
{
if(xNode.ChildNodes[i].Name == "Name")
tmpSrv.Name = xNode.ChildNodes[i].InnerText;
else if(xNode.ChildNodes[i].Name == "Host")
tmpSrv.Host = xNode.ChildNodes[i].InnerText;
else if(xNode.ChildNodes[i].Name == "Username")
tmpSrv.Username = xNode.ChildNodes[i].InnerText;
else if(xNode.ChildNodes[i].Name == "Password")
tmpSrv.Password = xNode.ChildNodes[i].InnerText;
}
tmpSrv.ID = xNode.Attributes["ID"].Value;
serverList.Add(tmpSrv);
}
}

public BindingList<Server> getServerList()
{
return serverList;
}

public void setServer(Server srv, bool isNew)
{
if(isNew)
{
serverList.Add(srv);
srvCount++;
}
else
{
string list = "/Settings/Server[@ID='"+srv.ID+"']";
XmlNodeList Xn = settings.SelectNodes(list);
if(Xn.Count == 1)
{
XmlNode srvNode = Xn[0];
for (int i=0; i<srvNode.ChildNodes.Count; i++)
{
if(srvNode.ChildNodes[i].Name == "Name")
srvNode.ChildNodes[i].InnerText = srv.Name;
else if(srvNode.ChildNodes[i].Name == "Host")
srvNode.ChildNodes[i].InnerText = srv.Host;
else if(srvNode.ChildNodes[i].Name == "Username")
srvNode.ChildNodes[i].InnerText = srv.Username;
else if(srvNode.ChildNodes[i].Name == "Password")
srvNode.ChildNodes[i].InnerText = srv.Password;
}
}
}

}
}

在另一个表单类中,我有以下函数,它在程序启动时被调用一次

public void populateServerListBox(ref BindingList<Server> srvList)
{
this.serverListBox.DisplayMember = "Name";
this.serverListBox.DataSource = srvList;
}

最后

public partial class NewServerForm : Form
{
private bool _isEdit = false;
private bool isCanceled = true;
private Server selSrv = null;

public NewServerForm()
{
InitializeComponent();
}

void NewServerFormOKBtClick(object sender, EventArgs e)
{
isCanceled = false;
this.Close();
}

void NewServerFormCancelBtClick(object sender, EventArgs e)
{
isCanceled = true;
this.Close();
}

public bool isEdit
{
get
{
return _isEdit;
}
set
{
_isEdit = value;
}
}

public void showForm(ref Server srv)
{
selSrv = srv;
isEdit = true;
this.newServerFormNameTb.Text = selSrv.Name;
this.newServerFormHostTb.Text = selSrv.Host;
this.newServerFormUsernameTb.Text = selSrv.Username;
this.newServerFormPwdTb.Text = selSrv.Password;
this.ShowDialog();
}

public void showForm()
{
selSrv = new Server();
this.ShowDialog();
}


void NewServerFormFormClosing(object sender, FormClosingEventArgs e)
{
if(isCanceled || selSrv == null)
this.Dispose();
else if(isEdit && selSrv != null)
{
selSrv.Name = this.newServerFormNameTb.Text;
selSrv.Host = this.newServerFormHostTb.Text;
selSrv.Username = this.newServerFormUsernameTb.Text;
selSrv.Password = this.newServerFormPwdTb.Text;
selSrv.BgwConfigPath = this.newServerFormBgwlocTb.Text;
isCanceled = true;
MainProgram.serverSettings.setServer(selSrv, false);
this.Dispose();
}
else if(selSrv != null)
{
selSrv.Name = this.newServerFormNameTb.Text;
selSrv.Host = this.newServerFormHostTb.Text;
selSrv.Username = this.newServerFormUsernameTb.Text;
selSrv.Password = this.newServerFormPwdTb.Text;

MainProgram.serverSettings.setServer(selSrv, true);
isCanceled = true;
this.Dispose();
}
}
}

我正在尝试为不同的服务器构建一个简单的用户设置菜单,用户可以在其中添加、删除或更改现有的服务器设置。在带有列表框的表单中,用户单击一个按钮,该按钮会弹出另一个表单,其中包含一些文本框供用户填写,然后单击“确定”以执行更改。

这些更改反射(reflect)在绑定(bind)列表中的项目中(新项目或对现有项目的更新)。添加一个新的服务器项目或从 bindingList 中删除一个服务器项目会立即反射(reflect)在列表框中,但是对现有项目进行更改会拒绝更新列表框。关闭包含列表框的表单并再次打开它会显示更改,但在列表框中完成更改后我无法立即让它工作。

我试过在列表框上调用 refresh(),在 BindingList 上调用 resetBindings() 以及其他一些方法。

我是不是漏掉了什么?

最佳答案

列表框的一个脏修复和已知的 Microsoft 错误:无论何时您需要刷新框内容设置 datasource = null,然后重新绑定(bind)它。

它不更新的原因是列表中的对象没有改变,它只检查对象的引用而不是它们的内容。

[编辑]

正确的做法是通过在“服务器”类上实现 INotifyPropertyChanged 接口(interface)。让我给你一些引用资料。

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=VS.80).aspx

http://www.gavaghan.org/blog/2007/07/17/use-inotifypropertychanged-with-bindinglist/

http://www.codeproject.com/KB/cs/BindBetterINotifyProperty.aspx

how to update listbox items with INotifyPropertyChanged

关于c# - 当 BindingList 中的现有项目发生更改时,列表框拒绝更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5683128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com