当绑定列表中的现有项目发生更改时,列表框拒绝更新

|| 在一天的大部分时间里,我一直都在疯狂,试图使它正常工作。 我的代码中有几个类。我将尝试在下面发布相关代码,并使其尽可能短
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();
        }
    }
}
我正在尝试为不同的服务器构建一个简单的用户设置菜单,用户可以在其中添加,删除或更改现有服务器设置。在带有列表框的表单中,用户单击一个按钮,该按钮将弹出另一个带有一些文本框的表单,供用户填写,然后单击“确定”以执行更改。 这些更改反映在bindingList中的Items中(要么是新项目,要么是更新到现有项目)。添加新服务器项或从bindingList中删除一个服务器项会立即反映在列表框中,但是对现有项目进行更改会拒绝更新列表框。关闭包含列表框的表单,然后再次打开它将显示更改,但是当列表框中的更改完成后,我无法立即使它生效。 我试过在列表框上调用refresh(),在BindingList上调用resetBindings()以及其他一些方法。 我在这里想念什么吗?     
已邀请:
一个肮脏的修复程序和列表框的已知Microsoft错误:因此,您需要刷新框内容集datasource = null,然后重新绑定它。 它之所以不会更新,是因为列表中的对象没有更改,它仅检查对象的引用而不是其内容。 [编辑] 正确的方法是在\“ Server \”类上实现
INotifyPropertyChanged
接口。让我给您一些参考资料。 http://msdn.microsoft.com/zh-CN/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 如何使用INotifyPropertyChanged更新列表框项目     

要回复问题请先登录注册