【问题标题】:C# PictureBox.Image DataBind to Object Image PropertyC# PictureBox.Image DataBind to Object Image 属性
【发布时间】:2016-06-08 08:11:54
【问题描述】:

我有一个类 Employee 定义为这个

public class Employee : INotifyPropertyChanged
{
     private Image photo;


     public Image Photo
     {
            get { return photo; }
            set { photo = value; InvokePropertyChanged(new PropertyChangedEventArgs("Photo")); }
     }


    #region Implementation of INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    public void InvokePropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, e);
    }

    #endregion

}

这是我的用法:我有一个名为pbPhotoPictureBox 控件,它的图像具有我的Resources.Blank 的默认值,该属性数据绑定到Employee.Photo 属性在Page_Load 事件中。

Employee employee = new Employee();
this.pbPhoto.DataBindings.Add("Image", employee, "Photo");

但它似乎不起作用,我收到了这个错误消息。

无法将值格式化为所需的类型。

【问题讨论】:

  • 第二个参数应该包含一个对象,而不是一个类型
  • 请检查修改后的问题。
  • 我看不到您实际设置 Photo 属性的位置。我猜您不能将绑定设置为返回 null 的属性
  • 如果您不想将图像分配给员工的照片属性,然后在员工类的构造函数中为照片属性添加一个空图像,例如:this.photo = new位图(1, 1);
  • 这个解决了我的问题,由于对象的照片图像属性为空而发生错误。我刚刚分配了一个空白.png,它运行良好。谢谢。

标签: c# winforms data-binding


【解决方案1】:

这是由一个非常古老的 WinForms 数据绑定错误行为引起的,通过将 Binding.FormattingEnabled 属性设置为 true 进行了修复(不幸的是,默认情况下“向后兼容性”是 false):

this.pbPhoto.DataBindings.Add("Image", employee, "Photo", true);

如果要在数据源属性为空时关联默认值,可以使用Binding.NullValue属性:

this.pbPhoto.DataBindings.Add("Image", employee, "Photo", true,
    DataSourceUpdateMode.OnValidation, Resources.Blank);

【讨论】:

  • 我刚刚更新了我的问题,这个问题部分解决了我的问题,但我的PictureBox 有一个默认的Image 值,每当我加载表单时,Image 就会消失。
  • 在将employee.Photo 属性转换为byte[] object reference not set to an instance of an object 时出现错误,但我可以通过根据@Mono 建议将初始图像分配给employee.Photo = Resources.Blank 来实现这一切在下面的问题评论中。
【解决方案2】:

我刚刚根据上面的Mono's comment解决了这个问题,

有两种不同的方法:

首先,在将pbPhoto.Image 属性绑定到对象Photo 属性之前,您必须为employee.Photo 分配一个默认值,因为我们无法设置返回null 值的绑定属性。

Employee employee = new Employee();
employee.Photo = Resources.Blank; // Initial value.
this.pbPhoto.DataBindings.Add("Image", employee, "Photo");

另一种是在Employee构造函数中设置Photo属性初始值。

public Employee()
{
    this.Photo = Resources.Blank;
}

那么你可以继续这个。

// During the program execution the Photo has an initial assigned value.
Employee employee = new Employee(); 
this.pbPhoto.DataBindings.Add("Image", employee, "Photo");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2010-10-18
    • 2017-11-08
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多