我有一个清单。我已将其转换为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”类型异常
其他信息:指数超出范围。必须是非负数且小于集合的大小。
答案 0 :(得分:1)
我猜这是SelectedRows
没有返回你期望的东西。由于它是一行中的单个按钮,因此请使用dgJobItems.Rows
和e.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>();
顺便说一下,这个扩展假定无法选择多行。如果你不是这样的话,可能需要改变它。