在C#中从DataGridView中提取业务对象

时间:2017-03-15 15:39:44

标签: c# datagridview bindingsource

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

我的问题是我无法正确地将所选业务对象从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;  
        }


    }

JobItem:

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”类型异常

其他信息:指数超出范围。必须是非负数且小于集合的大小。

2 个答案:

答案 0 :(得分:1)

我猜这是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());
}

答案 1 :(得分:0)

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

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>();

顺便说一下,这个扩展假定无法选择多行。如果你不是这样的话,可能需要改变它。