在 C# 中将业务对象从 DataGridView 中拉出

Pulling a Business Object off a DataGridView in C#

我有一个列表。我已将其转换为 BindingList 并放入 BindingSource 并绑定到 DataGridView,以便我可以让用户 select 他们想要打印哪个 JobItem。 DataGridView 有一个 ButtonColumn,用户选择 JobItem,单击 ButtonColumn,JobItem 打印到热敏打印机。

我的问题是我无法使用正确的语法将 selected 业务对象从 DataGridView 中提取出来,以便将其发送到打印功能。

这是我目前正在尝试的:

BusinessObjects.JobItem row = dgJobItems.SelectedRows[e.RowIndex].DataBoundItem;

这是我的其余代码:

DataGridViewButtonColumn btnPrint = new DataGridViewButtonColumn();
btnPrint.Text = "Print";
btnPrint.Name = "bPrint";
btnPrint.UseColumnTextForButtonValue = true;
dgJobItems.Columns.Add(btnPrint);

private void dgJobItems_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        if (dgJobItems.Columns[e.ColumnIndex].Name == "bPrint")
        {
            BusinessObjects.JobItem row = dgJobItems.SelectedRows[e.RowIndex].DataBoundItem;  
        }


    }

工作项目:

public class JobItem
{
    public int jobNumber { get; set; }
    public string serialNumber { get; set; }
    public string modelNumber { get; set; }
    public int quantity { get; set; }
    public string description { get; set; }

    public JobItem()
    {

    }
}

抱歉...我收到以下我不理解的错误:

ArgumentOutOfRangeException 未处理 mscorlib.dll

中发生类型 'System.ArgumentOutOfRangeException' 的未处理异常

附加信息:索引超出范围。必须为非负数且小于集合的大小。

我猜是 SelectedRows 没有返回您所期望的。由于它是一行中的单个按钮,因此使用 dgJobItems.Rowse.rowIndex 如下所示。看看这是否有帮助。

if (dgJobItems.Columns[e.ColumnIndex].Name == "bPrint") {
  JobItem jobItem = (JobItem)dgJobItems.Rows[e.RowIndex].DataBoundItem;
  MessageBox.Show("Job Item" + jobItem.ToString());
}

我有一个扩展方法用于获取当前选定行的相关业务对象。

public static T GetSelectedPOCO<T>(this DataGridView grid) where T : class
{
    return (grid.SelectedRows.Count == 1)
        ? grid.SelectedRows[0].DataBoundItem as T
        : null;
}

可以这样调用:

Customer selectedCustomer = dgvCustomers.GetSelectedPOCO<Customer>();

顺便说一句,此扩展假定无法选择多行。如果您不是这种情况,可能需要更改它。