C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: DGVImageColumnの表示がおかしい


(過去ログ 97 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■58082 / inTopicNo.1)  DGVImageColumnの表示がおかしい
  
□投稿者/ インデックス (4回)-(2011/03/25(Fri) 01:41:32)

分類:[C#] 

DataGridViewImageColumnでイメージを表示することは出来るのですが
一番最初のセルの画像だけが指定した条件と異なる画像を表示してしまいます。
図で表すとこんな感じです。

|imageColumn|Text |
|     E     |text1|
|     B     |text2|
|     C     |text3|
|     D     |text4|
|     E     |text5|
最初のセルに表示されるイメージは必ず最後に取得したイメージが表示されます。

↓このように表示したいです
|imageColumn|Text |
|     A     |text1|
|     B     |text2|
|     C     |text3|
|     D     |text4|
|     E     |text5|

どうすれば解決出来るのでしょうか?

−−−−−−−−−−−−−−−−−−大体のソースの流れ
DataGridViewImageColumn imageColumn = new DataGridViewImageColumn();
imageColumn.Name = "imageColumn";
imageColumn.Width = 50;

this.dataGridView1.Columns.Add(imageColumn);
this.dataGridView1.Columns.Add("no", "No");
while(true)
{
  string text="text";
  switch(式)
  {
case 12:
   WebClientとStreamで指定アドレス上の画像を取得
   imageColumn.Name = "imageColumn"; 
   imageColumn.Image = new Bitmap(mark);
   imageColumn.ImageLayout = DataGridViewImageCellLayout.Zoom;

   this.Invoke(new MethodInvoker(delegate
      {
       this.dataGridView1["imageColumn",0].Value = new Bitmap(mark);
       this.dataGridView1.Rows.Add(new Bitmap(mark), text);
      }));
  break;
  ・
  ・
  ・
default:
  break;
  }
  もしこの条件を満たせばreturn;
}

引用返信 編集キー/
■58140 / inTopicNo.2)  Re[1]: DGVImageColumnの表示がおかしい
□投稿者/ インデックス (5回)-(2011/03/26(Sat) 22:54:01)
読み込むたびに1番先頭のセル画像がコロコロ変わってしまうのですが
どうしたら画像を固定できるのでしょうか?

ソースは大雑把ですがこんな感じです。
よろしくお願いします。

DataGridViewImageColumn imageColumn = new DataGridViewImageColumn();
imageColumn.Name = "imageColumn";
imageColumn.Width = 50;
imageColumn.ImageLayout = DataGridViewImageCellLayout.Zoom;
this.dataGridView1.Columns.Add(imageColumn);

while (true)
 {
                byte[] resBytes = new byte[MAX_RECEIVE_SIZE];
                int resSize = sock.Receive(resBytes, resBytes.Length, System.Net.Sockets.SocketFlags.None);
                int trim_start_v8 = 0;
                int trim_end8 = 4;


                if (user_id.Length == 8)
                {
                  user_no_tmp = user_id.Substring(trim_start_v8, trim_end8);
                }
                user_thum_url = "http://usericon.nimg.jp/usericon/" + user_no_tmp + "/" + user_id + ".jpg";

             WebClient image_get8 = new WebClient();
                Stream image_get_stream8 = image_get8.OpenRead(user_thum_url);
                Bitmap user_thum8 = new Bitmap(image_get_stream8);
                image_get_stream8.Close();
                imageColumn.Image = new Bitmap(user_thum8);
                imageColumn.ImageLayout = DataGridViewImageCellLayout.Zoom;
                                                
                this.Invoke(new MethodInvoker(delegate
                {
               this.dataGridView1["imageColumn", 0].Value = new Bitmap(user_thum8);
                 this.dataGridView1.Rows.Add(new Bitmap(user_thum8));
                 this.dataGridView1.AllowUserToAddRows = false;
                }));
 }

※UIフリーズ防止のためスレッド処理にしてあります。

引用返信 編集キー/
■58172 / inTopicNo.3)  Re[2]: DGVImageColumnの表示がおかしい
□投稿者/ ヘッタッタ (1回)-(2011/03/28(Mon) 13:54:13)
No58140 (インデックス さん) に返信

>    this.dataGridView1["imageColumn", 0].Value = new Bitmap(user_thum8);
> this.dataGridView1.Rows.Add(new Bitmap(user_thum8));

ここの上の行がよく分からないんだけど。
引用返信 編集キー/
■58211 / inTopicNo.4)  Re[3]: DGVImageColumnの表示がおかしい
□投稿者/ インデックス (6回)-(2011/03/29(Tue) 05:47:20)
No58172 (ヘッタッタ さん) に返信
説明不足でしたすみません、再度纏めてみました。

            DataGridViewImageColumn imageColumn = new DataGridViewImageColumn();
            imageColumn.Name = "imageColumn";
            imageColumn.Width = 50;
            imageColumn.ImageLayout = DataGridViewImageCellLayout.Zoom;
            this.dataGridView1.Columns.Add(imageColumn);
            this.dataGridView1.Columns.Add("no", "No");
            this.dataGridView1.Columns.Add("come", "コメント");//列の作成
            this.dataGridView1.Columns.Add("user_id", "ユーザーID");
       while (true)
            {
             サーバーとの通信処理
           ・
           ・
           ・
            this.dataGridView1.Rows.Clear();
                    backgroundWorker1.RunWorkerAsync();
                    break;
            }

---------------------------------------別スレッド
         while(true)
              {
        データの受信処理
            ・
            ・
            ・
                string comecount = "";
                string come2 = "";
                string user_id = "";
                string user_no_tmp = "";
                string user_thum_url = "";
                string user_thum_check_url = "";
                int trim_start_v8 = 0;
                int trim_end8 = 4;
                xml = xml.Replace('\0', '\n');

                var xdoc1 = new XmlDocument();
                xdoc1.LoadXml(String.Format("<root>{0}</root>", xml));
                foreach (XmlNode ndtmp in xdoc1.ChildNodes)
                {
                    foreach (XmlNode nd in ndtmp.ChildNodes)
                    {
                        var attr = nd.Attributes;
                        if (nd.Name == "chat")
                        {
                            come2 = String.Format(nd.InnerText);
                            comecount = attr["no"].Value;
                            user_id = attr["user_id"].Value;
                        }

                        if (user_id.Length == 8)
                        {
                            user_no_tmp = user_id.Substring(trim_start_v8, trim_end8);
                        }
                        this.Invoke(new MethodInvoker(delegate
                            {
                                dataGridView1.AllowUserToAddRows = true;
                            }));
                                DataGridViewImageColumn imageColumn = new DataGridViewImageColumn();
                                imageColumn.Name = "imageColumn";
                                imageColumn.Width = 50;
                                switch(user_id.Length)
                                {
                                    case 8://8ケタ
                                    user_thum_check_url = "http://usericon.nimg.jp/usericon/" + user_no_tmp + "/" + user_id + ".jpg";    
                                    HttpStatusCode error_status8=GetStatusCode(user_thum_check_url);
                                    int error_code8 = (int)error_status8;
                                            if (error_code8 == 404)//エラー404の検出
                                            {
                                                user_thum_check_url = "http://uni.res.nimg.jp/img/user/thumb/blank.jpg";
                                                WebClient not_set_image_cl = new WebClient();
                                                Stream not_set_image_str = not_set_image_cl.OpenRead(user_thum_check_url);
                                                Bitmap user_thum_not_found8 = new Bitmap(not_set_image_str);
                                                not_set_image_str.Close();
                                                imageColumn.Image = new Bitmap(user_thum_not_found8);
                                                imageColumn.ImageLayout = DataGridViewImageCellLayout.Zoom;
                                                
                                                this.Invoke(new MethodInvoker(delegate
                                                    {
                                                        this.dataGridView1["imageColumn", 0].Value = new Bitmap(user_thum_not_found8);
                                                        this.dataGridView1.Rows.Add(new Bitmap(user_thum_not_found8), comecount, come2, user_id);
                                                        this.dataGridView1.AllowUserToAddRows = false;
                                                    }));
                                                break;
                                            }  
                                            else
                                            {
                                                user_thum_url = "http://usericon.nimg.jp/usericon/" + user_no_tmp + "/" + user_id + ".jpg";
                                                WebClient image_get8 = new WebClient();
                                                Stream image_get_stream8 = image_get8.OpenRead(user_thum_url);
                                                Bitmap user_thum8 = new Bitmap(image_get_stream8);
                                                image_get_stream8.Close();
                                                imageColumn.Image = new Bitmap(user_thum8);
                                                imageColumn.ImageLayout = DataGridViewImageCellLayout.Zoom;
                                                
                                                this.Invoke(new MethodInvoker(delegate
                                                    {
                                                        this.dataGridView1["imageColumn", 0].Value = new Bitmap(user_thum8);
                                                        this.dataGridView1.Rows.Add(new Bitmap(user_thum8), comecount, come2, user_id);
                                                        this.dataGridView1.AllowUserToAddRows = false;
                                                    }));
                                                break;
                                            }
                                         ・
                                         ・
                                         ・
                                  }
                               }
                            }
といった流れです。

引用返信 編集キー/
■58212 / inTopicNo.5)  Re[4]: DGVImageColumnの表示がおかしい
□投稿者/ ツPツAツTツIツO (1回)-(2011/03/29(Tue) 09:55:11)
2011/03/29(Tue) 09:56:46 編集(投稿者)

No58211 (インデックス さん) に返信
> this.dataGridView1["imageColumn", 0].Value = new Bitmap(user_thum8);

多分、ヘッタッタさんはこの行で書き換えているんじゃないの?
と言いたいのではと思うのですが。
自分で書き換えているなら、変わってしまうのは自明なのではと。

ぐわっ、名前が変になってる。
PATIOが正解です。
なんかクッキーが壊れているような
引用返信 編集キー/
■58237 / inTopicNo.6)  Re[5]: DGVImageColumnの表示がおかしい
□投稿者/ インデックス (7回)-(2011/03/29(Tue) 17:47:30)
No58212 (PATIO さん) に返信
ヘッタッタさんと、PATIOさんがご指摘された部分
this.Invoke(new MethodInvoker(delegate
                           {
                           this.dataGridView1["imageColumn", 0].Value = new Bitmap(user_thum8);
                           this.dataGridView1.Rows.Add(new Bitmap(user_thum8), comecount, come2, user_id);
                           this.dataGridView1.AllowUserToAddRows = false;
                           }));
を
this.Invoke(new MethodInvoker(delegate
                           {
                           //this.dataGridView1["imageColumn", 0].Value = new Bitmap(user_thum8);
                           this.dataGridView1.Rows.Add(new Bitmap(user_thum8), comecount, come2, user_id);
                           this.dataGridView1.AllowUserToAddRows = false;
                           }));
とコメントにすることで最初のセルの画像が更新で変わること無く
条件通りに表示することが出来ました。
つまりコレ→this.dataGridView1["imageColumn", 0].Value = new Bitmap(user_thum8);
は要らなかったようです。

ありがとうございました、次回も機会がありましたらまたよろしくお願いします。

解決済み
引用返信 編集キー/
■58286 / inTopicNo.7)  Re[6]: DGVImageColumnの表示がおかしい
□投稿者/ PATIO (104回)-(2011/03/30(Wed) 16:29:35)
No58237 (インデックス さん) に返信
> ■No58212 (PATIO さん) に返信
> つまりコレ→this.dataGridView1["imageColumn", 0].Value = new Bitmap(user_thum8);
> は要らなかったようです。

既に解決になってしまっていますが、
自分自身が理解できていないプログラムをそのまま放置しないようにした方が良いです。
動いたから良しでは無いと思いますよ。
プログラムの各ステップが何をしているのかをきちんと理解していれば、
「要らなかったようです」という返信にはならないはずです。
もしプログラムの各ステップで何をやっているのかを理解できていないのでしたら
理解できるまできちんと調べて納得するまで勉強される事をお勧めします。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -