【问题标题】:Parameter is not valid datagridview default error dialog参数无效 datagridview 默认错误对话框
【发布时间】:2020-04-30 03:40:37
【问题描述】:
BindingList<Item> itemList = new BindingList<Item>();
        foreach (Item item in po.Items)
        {
            itemList.Add(item);
        }
        ==> dgvItems.DataSource = itemList;
        dgvItems.Columns["ItemId"].Visible = false;

当我运行我的程序时,它会在我用“==>”标记的行中抛出错误,我不知道错误来自哪里,因为当我调试列表时包含有效数据。它以前工作过,所以我认为出现错误是因为我对时间戳存储库代码进行了一些更改。

这是我的 Item 对象定义:

public class Item
{
    public byte[] TimeStamp { get; set; }

    public int ItemId { get; set; }

    [Required(ErrorMessage = "Item Name is required")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Description is required")]
    public string Description { get; set; }

    [Required(ErrorMessage = "Price is required")]
    public decimal Price { get; set; }

    [Required(ErrorMessage = "Location is required")]
    public string Location { get; set; }

    //public byte[] TimeStamp { get; set; }

    [Required(ErrorMessage = "Justification is required")]
    public string Justification { get; set; }

    [Required(ErrorMessage = "Quantity is required")]
    public int Quantity { get; set; }

    public int PurchaseOrderId { get; set; }

    public DateTime Date { get; set; }

    public ItemStatus Status { get; set; }

    public Item()
    {

    }

    public Item(int itemId, string name, string description, decimal price, string location, string justification, int quantity, int purchaseOrderId, DateTime date, ItemStatus status)
    {
        ItemId = itemId;
        Name = name;
        Description = description;
        Price = price;
        Location = location;
        Justification = justification;
        Quantity = quantity;
        PurchaseOrderId = purchaseOrderId;
        Date = date;
        Status = status;
    }
}

【问题讨论】:

  • 发布Item 对象定义。顺便说一句,您可以使用 var itemList = new BindingList&lt;Item&gt;(po.Items); 填充 BindingList
  • 我认为时间戳与 datagridview 冲突,它可能无法显示,有什么办法吗?并感谢您的建议
  • 当您在不使用任何类型转换器的情况下向 DGV 提供字节数组时,DGV 会尝试从中生成位图。当然它失败了,因此错误。 Item 的构造函数甚至不包括 TimeStamp 属性。您希望如何在网格中看到此属性?你真的需要看到这个值吗?如果它应该是可见的,它也应该是可编辑的吗?您是在 DGV 设计器中创建了相应的列还是自动生成了列?
  • 我不需要看值,列是自动生成的

标签: c# winforms


【解决方案1】:

这里有几个选项,看看哪个更合适。

选项 1

为 Item 类对象添加 [Browsable(false)] 属性:
DataGridView 不会为 TimeStamp 属性生成列。

请注意:

用 BrowsableAttribute 构造函数的可浏览标记的成员 设置为 false 的参数不适用于设计时编辑和 因此不会显示在视觉设计器中。

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

public class Item
{
    [Browsable(false)]
    public byte[] TimeStamp { get; set; }
    public int ItemId { get; set; }
    [Required(ErrorMessage = "Item Name is required")]
    public string Name { get; set; }
    //[...]
}

选项 2

在设置DataGridView.DataSource 后立即删除列:

请注意,您将无法通过 DataGridView 修改 TimeStamp 值。但是,正如 cmets 中提到的,这个属性不需要修改。

var itemList = new BindingList<Item>(po.Items);
dataGridView1.DataSource = itemList;
dataGridView1.Columns.Remove("TimeStamp");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多