为什么此代码阻止我的应用关闭?

时间:2010-10-27 07:35:21

标签: c# .net

在Visual Studio 2010,.NET 4.0中创建一个WinForms应用程序,然后使用以下代码创建一个用户控件(来自 Project / Add User Control ... ):

public partial class UserControl1 : UserControl
{
    private string _SelectedTable;

    public string SelectedTable
    {
        get { return _SelectedTable; }
        set { _SelectedTable = value; }
    }

    public UserControl1()
    {
        InitializeComponent();
        DataBindings.Add("SelectedTable", listBox1, "SelectedValue");
        listBox1.DataSource = new List<string>();
    }
}

编译,将工具框中的控件添加到Form1,再次编译并尝试关闭。它不会(对吧?)。为什么?

我可以采取一些措施来防止这种情况发生,例如将行DataBindings.Add("SelectedTable", listBox1, "SelectedValue");更改为DataBindings.Add("SelectedTable", tablesListBox, "SelectedValue", false, DataSourceUpdateMode.Never);,或删除InitializeComponent()之后的任意两行。但是我想知道为什么会发生这种情况,或者至少是什么,一般来说我做错了什么,我打破的一般规则,所以我不再犯同样的错误。

2 个答案:

答案 0 :(得分:1)

我认为应该是因为你从未说过SelectedValue的约束...
我改变了你的代码,它的工作原理如下:


Collection<Person> mylist = new Collection<Person>();            
listBox1.DataSource = mylist;
listBox1.DisplayMember = "Name";
listBox1.ValueMember = "ID";

DataBindings.Add("SelectedTable", listBox1, "SelectedValue");

答案 1 :(得分:1)

显然这是某种验证问题...如果在用户控件上将CausesValidation设置为false,则可以正常工作。不确定到底发生了什么......但是......

无论如何,如果您没有明确设置ValueMember属性,SelectedValue没有意义,则应使用SelectedItem。我使用SelectedItem代替SelectedValue尝试了您的代码,它运行正常。