2017-03-15 1 views
0

私はリストを持っています。これをBindingListに変換してBindingSourceに入れ、DataGridViewにバインドして、ユーザーが印刷するJobItemを選択できるようにします。 DataGridViewにはButtonColumnがあり、ユーザーはJobItemを選択し、JobItemがサーマルプリンタに印刷するButtonColumnをクリックします。CでDataGridViewからビジネスオブジェクトを引き出す

私の問題は、選択したビジネスオブジェクトを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

間違いではないですか?あなたは選択された行を持っているようです...何が欠けていますか? – JohnG

+0

私はめったにフロントエンドのものをやることはほとんどないので、これらのケースについては正確にこの質問にhttp://stackoverflow.com/questions/3577297/how-to-handle-click-event-in-button-column-in-datagridviewを主演しました。忘れる。これはあなたの問題thoへの答えではありません。しかし、通常、私の問題は間違ったイベントに結びついています。いずれにしても、そのボタンからオブジェクトIDを取得し、フロントエンドから印刷するためにデータを信頼するのではなく、対応するオブジェクトを送信することです。 – Rostol

+0

@JohnG申し訳ありません...はい、私はエラーが発生しました。私はそれを加えた。 ArgumentOutOfRangeExceptionは、mscorlibというdllファイルです。 dll。 –

答えて

1

私はあなたが期待しているものを返さないのはSelectedRowsだと推測しています。 1行に1つのボタンであるため、以下のようにdgJobItems.Rowse.rowIndexを使用してください。これが役立つかどうかを見てください。

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

ありがとう!それは今実行されています。 –

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

ところで、この拡張機能は、複数の行を選択することはできませんを前提としています。そうでない場合は、変更する必要があります。

関連する問題