Vb.net BindingSource/BindingNavigator:如何防止编辑绑定的数据源?

Vb.net BindingSource/BindingNavigator:如何防止编辑绑定的数据源?,vb.net,visual-studio-2005,bindingsource,readonly-collection,Vb.net,Visual Studio 2005,Bindingsource,Readonly Collection,我用VB.NET和Visual Studio 2005创建了一个数据源。我将数据源拖到对话框中,VS创建了包含链接对象成员的文本框,即System.Windows.Forms.BindingSource和System.Windows.Forms.BindingNavigator 我填充列表(称为myList),将myList设置为BindingSource中的数据源,除了我希望它是只读的之外,一切都很顺利。如果用户在其中一个文本框中更改了某些内容,则会保存更改 我尝试创建一个只读集合以绑定到Bi

我用VB.NET和Visual Studio 2005创建了一个数据源。我将数据源拖到对话框中,VS创建了包含链接对象成员的文本框,即
System.Windows.Forms.BindingSource
System.Windows.Forms.BindingNavigator

我填充列表(称为myList),将myList设置为BindingSource中的数据源,除了我希望它是只读的之外,一切都很顺利。如果用户在其中一个文本框中更改了某些内容,则会保存更改

我尝试创建一个只读集合以绑定到BindingSource,但这并没有解决问题:

Dim detailsDlg As New dlgMyDetails
Dim readOnlyList As New ReadOnlyCollection(Of MyObjects)(myList)

detailsDlg.MyBindingSource.DataSource = readOnlyList
detailsDlg.ShowDialog()
我想我可以禁用所有的文本框,但这似乎有点笨手笨脚,而且我可能想更改字体颜色,以便更容易阅读

理想情况下,我可能不在乎用户是否能够设置文本框的焦点,甚至编辑内容,但我只是不希望任何更改持续存在。也就是说,如果有人编辑了某些内容,使用导航器转到下一条记录,然后返回,我希望它保持在用户播放之前的状态

有什么建议/指导吗


提前谢谢

您可以将类(MyObject)中的属性更改为只读,或将属性System.ComponentModel.ReadOnly(true)添加到属性中,而不是创建只读集合,例如:

class Person
{
    public Person(int id, string name, string address)
    {
        _id = id;
        Name = name;
        Address = address;
    }

    private int _id = 0;
    public int ID { get { return _id; } }

    [System.ComponentModel.ReadOnly(true)]
    public string Name { get; set; }

    public string Address { get; set; }
}
ID和名称将是只读的,如果示例是C#,则很抱歉。希望这有帮助


干杯。

您可以将类(MyObject)中的属性更改为只读,或将属性System.ComponentModel.ReadOnly(true)添加到属性中,而不是创建只读集合,例如:

class Person
{
    public Person(int id, string name, string address)
    {
        _id = id;
        Name = name;
        Address = address;
    }

    private int _id = 0;
    public int ID { get { return _id; } }

    [System.ComponentModel.ReadOnly(true)]
    public string Name { get; set; }

    public string Address { get; set; }
}
ID和名称将是只读的,如果示例是C#,则很抱歉。希望这有帮助


干杯。

从模型视图控件的角度来看,您需要的约束不是模型或控件,而是视图。视图应限制屏幕上可编辑的内容


如果它确实是只读的,为什么不使用只读用户界面元素,即标签呢?这样做的原因是为了减少用户的困惑。如果它是一个文本框,则有一个合理的预期,即在某个点上数据将变得可编辑。如果不是这种情况,则显示禁用的文本框可能不是正确的UI元素,而不是如前所述显示标签。

从模型视图控件的角度来看,所需的约束不在模型或控件上,而在视图上。视图应限制屏幕上可编辑的内容


如果它确实是只读的,为什么不使用只读用户界面元素,即标签呢?这样做的原因是为了减少用户的困惑。如果它是一个文本框,则有一个合理的预期,即在某个点上数据将变得可编辑。如果情况并非如此,则显示禁用的文本框可能不是正确的UI元素,而是如上所述的标签。

非常感谢您对dkartopr的响应。这是否强制Person的所有实例都是只读的?一般来说,我需要读写这些对象的能力。使用System.ComponentModel.ReadOnly(true),是的,它将应用于Person的所有实例。例如,您有一个绑定到Name属性的文本框,对该文本框所做的更改将不会反映到Person的当前实例。另一方面,当您执行:instance.Name=“foo”时,这会将实例名称更改为“foo”。哦,这样我就可以通过编程方式更改Person的只读实例了?我假设我可以构造它们,但是这些值是用石头(就像C++)const“成员”设置的。(注意:我想这是有道理的,因为您的类同时定义了get和set。)非常感谢您对dkartopr的回复。这是否强制Person的所有实例都是只读的?一般来说,我需要读写这些对象的能力。使用System.ComponentModel.ReadOnly(true),是的,它将应用于Person的所有实例。例如,您有一个绑定到Name属性的文本框,对该文本框所做的更改将不会反映到Person的当前实例。另一方面,当您执行:instance.Name=“foo”时,这会将实例名称更改为“foo”。哦,这样我就可以通过编程方式更改Person的只读实例了?我假设我可以构造它们,但是这些值是用石头(就像C++)const“成员”设置的。(注意:我想这是有道理的,因为您的类同时定义了get和set。)非常有趣的想法!但我认为我会以这种方式表达自己的观点,对吗?通过将数据源拖到表单上,我可以在大约三秒钟内获得DataGridView或TextBox控件的集合。制作一组标签可能没这么容易?@cashcomons的John-1)你可以自己滚动,或者2)你可以使用DataGridView并禁用编辑。3) 创建标签控件集合与创建文本框控件集合一样简单。请记住,文本框和标签继承共享一个共同的父对象Control。我现在手头上没有VS 2005,但是我可以修改IDE为DGV和文本框提供的拖放功能来代替标签吗?这可能是我能走的最好的路,但如果我必须卷起袖子才能到达那里,我想学点新东西不会让我丧命非常有趣的想法!但我认为我会以这种方式表达自己的观点,对吗?通过将数据源拖到表单上,我可以在大约三秒钟内获得DataGridView或TextBox控件的集合。制作一组标签可能没这么容易?@cashcomons的John-1)你可以自己滚动,或者2)你可以使用DataGridView并禁用编辑。3) 创建标签控件集合与创建文本框控件集合一样简单。请记住,文本框和标签继承共享一个公共父对象CONT