2017-09-28 11 views
0

3層アーキテクチャのC#で電話帳を書いてみたいが、このアーキテクチャは十分ではない。 私たちはそれぞれの行をクリックすると、ピクチャボックス内の各人物のイメージを表示するdatagridviewを持っています。 しかし、それは動作しません。私はどこに問題があるのか​​分からない。私を案内してください。私は最近、このアーキテクチャについて知りました。ピクチャボックス内の3層アーキテクチャの連絡先写真を表示するC#

DALコード:

public void GetBinaryImage(int Id) 
    { 

     context.People.Select(a => new { a.Id, a.PersonImage }).Where(a => a.Id == Id) ; 

    } 

BLLコード

public void GrtBinaryImage(int person_Id) 
    { 

     Myperson.GetBinaryImage(person_Id); 

    } 

PLコード

private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     if (dataGridView.SelectedRows.Count > 0) 
     { 
      int Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); 
      showpictureBox.Image = bytearytoimage(person.GrtBinaryImage(Id)); 


     } 
    } 

    private Image bytearytoimage(object v) 
    { 
     MemoryStream stream = new MemoryStream(v); 
     return Image.FromStream(stream); 
    } 

私はエラーを取得する:

"Argument 1: cannot convert from 'void' to object".

私はミスを書いたことを知っています。私を案内してください。

+0

どうしたらうまくいかないのですか? – musefan

+0

エラー "引数1: 'void'から 'object'に変換できません。 –

+0

あなたのGrtBinaryImageメソッドがBLLから返ってきていません。私はそれがbytearytoimageに必要なオブジェクトを返すはずです。 あなたのBLLメソッドを更新してください。 –

答えて

-1

関数から値を返すことについての理解が不足しているようです。

まず、あなたのDLL関数は何も返されません。PersonImageを返そうとしていると思いますが、これはうまくいけばbyte[]です。また、あなたが返すようにしたい値だけを選択するためのコードを変更する必要があります:アップ

DLL

public byte[] GetBinaryImage(int Id) 
{ 
    byte[] result = context.People.Where(a => a.Id == Id).Select(a => a.PersonImage).SingleOrDefault(); 
    return result; 
} 

次に、あなたBLLでの戻り値と同じ問題を抱えている:

あなたが望む結果を得るために十分であるべき

BLL

public byte[] GrtBinaryImage(int person_Id) 
{ 
    return Myperson.GetBinaryImage(person_Id); 
} 

、私はまた、具体的byte[]にごbytearytoimage機能のパラメータの種類を変更することをお勧めだろうが:

PL

private Image bytearytoimage(byte[] v) 
{ 
    MemoryStream stream = new MemoryStream(v); 
    return Image.FromStream(stream); 
} 

(注)このすべてはPersonImagebyte[]であるという事実にかかっていること。そうでない場合は、作業するデータについてより具体的に質問を更新する必要があります。

関連する問題