DOBON.NET DOBON.NETプログラミング掲示板過去ログ

リストビューでマウスの移動に応じてカラムに背景色を付けたい

環境/言語:[Windows 7/Vista MS2010 C# Winアプリ]
分類:[.NET]

お世話になります。

listViewの任意のカラムをマウスの移動に応じて背景色を変えたいと思いますが、うまくいきません。マウスがのっかている部分のみ変化させたい。

下記のコードでは、画面がちらつくのみで色は変化しません。


コード
ListViewItem lvi = new ListViewItem(item1);
lvi.ToolTipText = values22[0] + "/" + values22[1] + "/" + values22[2] + "/" + values22[3] + "/" + values22[4] + "/" + values22[5] + "/" + values22[6] + "/" +
values3[0] + "/" + values3[1] + "/" + values3[2] + "/" + values3[3] + "/" + values3[4] + "/" + values3[5];
lvi.Tag = "abcde";
ListViewItem item4 = listView2.Items.Add(lvi);

item4.UseItemStyleForSubItems = false;


private void listView2_MouseMove(object sender, MouseEventArgs e)
{
var hitpt = e.Location;
ListViewHitTestInfo info = listView2.HitTest(hitpt);
if (info.SubItem != null)
{
int pos = GetColumnNumber(hitpt);

if ((pos > 0 && pos < 7) || (pos > 8 && pos < 16) || (pos > 17 && pos < 24))
// マウスの移動に応じて反転セルを移動する
listView2.Items[info.Item.Index].SubItems[pos].BackColor = System.Drawing.Color.Red;
}
}


private int GetColumnNumber(Point pos)
{
// カラムのサイズから計算してマウスがポイントしているサブアイテムの位置を返す

// カラム位置を調べる
int[] colWidth = new int[listView2.Columns.Count];
for (int i = 0; i < listView2.Columns.Count; ++i)
{
colWidth[i] = listView2.Columns[i].Width;
}

int num = -1;
if (pos.X < colWidth[0] + 1)
num = 0;
else
{
int len = 0, k = 0;
foreach (int co in colWidth)
{
len += co;

if (pos.X < len)
{
num = k;
break;
}
++k;
}
}

return num;
}

よろしくお願いします。
listView2.Items[info.Item.Index].SubItems[pos].BackColor=System.Drawing.Color.Red;
がきちんと動作していないのではないかと疑っています。
listView2.Items[info.Item.Index].UseItemStyleForSubItems=false
になっていますでしょうか?コード上は記述ないことは確認できたのですが
画面デザインで固定的に設定している可能性もあるため、確認です。
■No31382に返信(kikuさんの記事)
> listView2.Items[info.Item.Index].SubItems[pos].BackColor=System.Drawing.Color.Red;
> がきちんと動作していないのではないかと疑っています。
> listView2.Items[info.Item.Index].UseItemStyleForSubItems=false
> になっていますでしょうか?コード上は記述ないことは確認できたのですが
> 画面デザインで固定的に設定している可能性もあるため、確認です。

すみません。コード上ちゃんと設定してますね。
撤回します。
環境(VS2008、.NET3.5、C#、WinXP)が違いますが、
下記のように修正することによって動作していることを確認しました。
環境の違いでしょうか?

private void Form1_Load(object sender, EventArgs e)
{
string[] stArrayData1 = {"1aaa","1bbb","1ccc","1ddd"};
ListViewItem lvi = new ListViewItem(stArrayData1);
ListViewItem item4 = listView2.Items.Add(lvi);
item4.UseItemStyleForSubItems = false;

string[] stArrayData2 = { "2aaa", "2bbb", "2ccc", "2ddd" };
lvi = new ListViewItem(stArrayData2);
item4 = listView2.Items.Add(lvi);
item4.UseItemStyleForSubItems = false;

}

private void listView2_MouseMove(object sender, MouseEventArgs e)
{
var hitpt = e.Location;
ListViewHitTestInfo info = listView2.HitTest(hitpt);
if (info.SubItem != null)
{
int pos = GetColumnNumber(hitpt);

listView2.Items[info.Item.Index].SubItems[pos].BackColor = System.Drawing.Color.Red;
//if ((pos > 0 && pos < 7) || (pos > 8 && pos < 16) || (pos > 17 && pos < 24))
//{
// // マウスの移動に応じて反転セルを移動する
// listView2.Items[info.Item.Index].SubItems[pos].BackColor = System.Drawing.Color.Red;
//}
}
}
kiku様、お世話になります。


一つ書き忘れていました、というか気付くのに少し時間がかかったことがあります。
と言うのも、このlistViewは派生クラスでした。
public class OAKListView : ListView

派生クラスであっても上記コードでできるのでは?と思い確認してみましたが、無理?のようでした。
派生クラスでないlistViewで同様のコードを書いてみたところ正しく表示します。
これを、派生クラスを使用したlistViewで書いてみると、ちらつくのみで表示してきませんでした。

じゃ、派生クラスのどっか表示場所(OnPaint, OnMouseMove, OnPaintBackground)などBreakPointを置いてみましたが、反応しないので今のところわかりません。

http://www.codeproject.com/Articles/7630/ListView-with-Image-on-SubItems
これを参考に、さらにリストアイテムにテキストボックスやコンボボックスを表示できるように改編しました。
 ですのでこのサンプルの問題かその後に加えた部分の可能性がありますので調べてみたいと思います。

お世話になりました。ありがとうございます。

DOBON.NET | プログラミング道 | プログラミング掲示板