在 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.Rows
和 e.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>();
顺便说一句,此扩展假定无法选择多行。如果您不是这种情况,可能需要更改它。
我有一个列表。我已将其转换为 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.Rows
和 e.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>();
顺便说一句,此扩展假定无法选择多行。如果您不是这种情况,可能需要更改它。