• 締切済み

C#:ListViewのEnable処理について

すいません、教えてください。 .Net2003のC#でアプリを作成しているのですが、 ListViewのEnableにfalseをセットしたときに、データ行がない所はグレーに変色されるのですが、データがある行だけはグレーに変色されません。 ちなみにFormのEnableをfalseにした場合は、綺麗にグレーになったと思うのですが、訳あってそうする事にもいかず困っています。 すいませんが、ご指導願えますでしょうか。 OSはWindowsXPです。 (マニュフェストファイルでXPスタイルを使用してます。)

  • mil9
  • お礼率90% (10/11)

みんなの回答

  • jyuzou
  • ベストアンサー率41% (97/231)
回答No.1

ListViewのBackColorプロパティをEnable=falseと同タイミングで変更させれば一応実現できます。 全然綺麗な方法じゃないですね・・・

mil9
質問者

お礼

やっぱりその方法しかないんですかね。 他に回答がないみたいですし・・・。 .Netじゃ不可能ぽいみたいですね。 ---- ちょっと試してみた所、スムーズに色チェンジされているようなので、とりあえずはこの方法で行ってみたいとおもいます。 ありがとうございました!

関連するQ&A

  • ListViewについて

    いつもお世話になっています。 タイトルの通り、ListViewについて2つ質問があります。 (1)ListViewにDBから検索したデータを代入してますが、動きが遅いんです。  各項目ごとで色を変更したりするためだと思いますが、ListViewの表示を速くする方法はなにかありませんか?  ちなみに今は、ListViewを2枚使って、データをセットしている間は、VisibleをFalseにして、  データセットが完了した時点で、Trueに切り替えています。 (2)(1)の動きで、ListViewを使っているところ、今表示されているListView(Iとします)で  クリックしたデータを次に表示させるListView(IIとします)に引き継がせたいです。  Iで、選択している行をIIで選択状態にすることはできたのですが、  Iで選択している行がスクロールして下にあった場合、IIでもスクロールした場所に  ListViewを移動させたいのですが、その方法が分かりません。 何かご存知の方がいましたら、教えてください。 よろしくお願いいたします。

  • ListViewでサブアイテムが表示されない

    VC++2008にて、プロジェクト形式がWindowsエクスプローラの MFCアプリケーションにてプログラムを作成しています。 ListViewにて、InsertColumn、InsertItem、SetItemTextを 行い、カラムと項目のデータ設定をしているのですが、 ListViewを詳細表示にすると、設定したサブアイテムが 表示されない場合があります。 InsertItemで設定した文字列は、設定した分だけ、 左端にキチンと表示されているのですが、 それ以降のサブアイテムについては、表示されている行もあれば 表示されていない行もあります。 1行に複数のサブアイテムを設定しているのですが、 表示されている場合は、サブアイテム全てが表示されており、 表示されていない場合は、サブアイテム全てが表示されていません。 デバッグで追う限り、データ設定自体は問題なく、 表示される行と、されない行について、 差異を探してみましたが、別段、違ったことはしていません。 ListViewについては、PreCreateWindowにて cs.style |= TVS_SHOWSELALWAYS; cs.style |= LVS_SINGLESEL; cs.style &= ~LVS_TYPEMASK; 上記、設定を行っています。 この他に、何か設定が足りなくて、表示されていないのでしょうか?

  • ListViewとArrayListの連動がうまくいきません

    メールソフトの中で既読、未読を設定するフラグを実装しているのですが ListViewのカラムクリック時の昇順・降順設定を追加するとなぜか おかしな表示になってしまいます。 未読(フラグがtrue)の時は太字で表示されて、既読(フラグがfalse)の 場合は通常のフォントで表示するようにしてあるのですが、 指定している配列ですべてtrueにしているのにもかかわらず表示されるのは trueとfalseの結果の表示がまばらに出てしまって何が原因なのかが 分かりません。 どうすればこれを解決する事が出来るでしょうか? 環境はVS2005(C#)、.NET Framework 2.0です。 リストビューの昇順・降順ロジックはどぼんの.NET Tipsに 載っている文字列、数字、日付で比較が可能なタイプのを 使用しています。 public void UpdateListView() { ArrayList list = null; int i = 0; if (listView1.Columns[1].Text == "差出人") { // 受信メールの場合 list = collectionMail[RECEIVE]; } else if (listView1.Columns[1].Text == "差出人または宛先") { // 削除メールの場合 list = collectionMail[DELETE]; } listView1.BeginUpdate(); // リストビューの内容をクリアする listView1.Items.Clear(); // ListViewを設定する foreach (Mail mail in list) { ListViewItem item = new ListViewItem(mail.subject); item.SubItems.Add(mail.address); item.SubItems.Add(mail.date); // この2行を追加 item.Tag = i; i++; listView1.Items.Add(item); // 未読(未送信)の場合は、フォントを太字にする int index = listView1.Items.Count - 1; if (mail.notReadYet == true) { listView1.Items[index].Font = new Font(this.Font, FontStyle.Bold); } } listView1.EndUpdate(); } private void listView1_DoubleClick(object sender, EventArgs e) { Mail mail = null; ListViewItem item = listView1.SelectedItems[0]; if (listView1.Columns[1].Text == "差出人") { mail = (Mail)collectionMail[RECEIVE][(int)item.Tag]; } else if (listView1.Columns[1].Text == "差出人または宛先") { mail = (Mail)collectionMail[DELETE][(int)item.Tag]; } mail.notReadYet = false; textBox1.Text = mail.body; UpdateListView(); } private void Form1_Load(object sender, EventArgs e) { // ListViewにアイテムを追加する for (int no = 0; no < subject.Length; no++) { Mail mail = new Mail(subject[no], address[no], date[no], body[no], read[no]); collectionMail[RECEIVE].Add(mail); } UpdateTreeView(); UpdateListView(); // ListViewItemComparerの作成と設定 listViewItemSorter = new ListViewItemComparer(); listViewItemSorter.ColumnModes = new ListViewItemComparer.ComparerMode[] { ListViewItemComparer.ComparerMode.String, ListViewItemComparer.ComparerMode.String, ListViewItemComparer.ComparerMode.DateTime }; // ListViewItemSorterを指定する listView1.ListViewItemSorter = listViewItemSorter; }

  • ListViewで条件式を使う方法

    Visual Basic 2010でDatasetとListviewを使ってプログラムを作成しています。 DatasetのデータをListviewに表示させるプログラムは下記のコードで完成しました。 ******************************* Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With ListView1 .Columns.Add("date", 40, HorizontalAlignment.Left) .Columns.Add("no", 40, HorizontalAlignment.Left) .Columns.Add("住所", 100, HorizontalAlignment.Left) showlist() End With End Sub Private Sub showlist() Try 住所TableAdapter.Fill(Kz526DataSet.住所) Catch ex As Exception MessageBox.Show(ex.Message, "住所テーブル") End Try With Kz526DataSet.住所 For i As Integer = 0 To .Rows.Count - 1 ListView1.Items.Add(.Rows(i)("date"), (i)) ListView1.Items(i).SubItems.Add(.Rows(i)("no")) ListView1.Items(i).SubItems.Add(.Rows(i)("住所")) Next End With End Sub ************************************ 次に、Datasetのデータの内一部だけListviewに表示させることにしました。そのため、テキストボックスを設けて、その日付と同じデータをListviewに表示させます。 テキストボックスを設けて、ボタンをクリックしてデータをListviewに表示させようとしたコードです。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With ListView1 .Columns.Add("date", 40, HorizontalAlignment.Left) .Columns.Add("no", 40, HorizontalAlignment.Left) .Columns.Add("住所", 100, HorizontalAlignment.Left) showlist() End With End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 住所TableAdapter.Fill(Kz526DataSet.住所) With Kz526DataSet.住所 For c As Integer = 0 To .Rows.Count - 1 If TextBox1.Text = Kz526DataSet.住所.Rows(c)("data") Then ListView1.Items.Add(.Rows(c)("date"), (c)) ListView1.Items(c).SubItems.Add(.Rows(c)("no")) ListView1.Items(c).SubItems.Add(.Rows(c)("住所")) End If Next End With End Sub *************************************** このコードでは、条件式とListViewの関係がいまくいきません。エラーメッセージは次の様に表示されます。 「'3' の InvalidArgument=Value は 'index' に対して有効ではありません。 パラメーター名: index」 いろいろ試行錯誤してみましたところ、「ListView1.Items(c).SubItems.Add(.Rows(c)("no"))」のところで止まります。 if文では、Thenのあとは1行しか書けないのでしょうか。書き方をご指導ください。

  • CSSで条件によってボタンの文字色を変えたい。

    HTMLのスタイルシートでFormの文字色が変えれる事はわかっています。 style="background:red;color:white;" でいいんですよね。 そこで、CSSで条件によってボタンの文字色を変えたいのですが、どうすればいいでしょうか? なぜ、こんな事を考えるようになったかというと、 IE等では、ボタンのEnableがTrueの時は黒色(バックは普通)、Falseの時は灰色(バックは薄い)状態になるのですが、 この前、chromeでそのボタンを確認したところ、TrueでもFalseでも文字色が黒になっていました。 そこで、ボタンのEnableがFalseの時に、文字色を灰色に変えたいのですが、そんな事ってCSSを使ってでも出来るのでしょうか? もし出来ないとしたら、ボタンひとつずつスタイルを設定しないといけないという面倒な事になりそうなのです。 もし、CSSでボタンがEnable=falseの時だけ、ボタン色を灰色にする方法がわかる方がいらっしゃいましたら、回答してください。 急ぎませんので、回答よろしくお願いします。

    • ベストアンサー
    • HTML
  • VB6 API LISTVIEW(チェックボックス付き)にチェックを付けたい

    CreateWindowExでLISTVIEW(チェックボックス付きのレポートビュー)を作ったのですが、「山田花子」行にソースでチェックを付ける方法が分かりません。 Form1のソース ↓ Option Explicit Private Sub Form_Load() Dim lngRet As Long Dim lvcol As LV_COLUMN Dim rStyle As Long Dim item As LV_ITEM '-- リストビューの作成 hList = CreateWindowEx(WS_EX_CLIENTEDGE, _ WC_LISTVIEW, "", _ WS_CHILD Or WS_VISIBLE Or WS_BORDER Or _ WS_CLIPSIBLINGS Or WS_CLIPCHILDREN Or _ LVS_REPORT, _ 0&, 0&, Me.ScaleWidth / Screen.TwipsPerPixelX, 200&, _ Me.hwnd, _ 0&, _ App.HINSTANCE, _ ByVal 0&) '拡張スタイルを設定 rStyle = rStyle Or LVS_EX_FULLROWSELECT Or LVS_EX_GRIDLINES Or LVS_EX_CHECKBOXES SendMessageByNum hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0&, rStyle '-- カラムヘッダーの追加 With lvcol .mask = LVCF_FMT Or LVCF_WIDTH Or LVCF_TEXT Or LVCF_SUBITEM .fmt = LVCFMT_LEFT .cx = 100 .pszText = "名前" .iSubItem = 0 lngRet = ListView_InsertColumn(hList, 0&, lvcol) End With '-- リストアイテムの追加 With item .mask = LVIF_TEXT Or LVIF_IMAGE ' 1つめ .pszText = "山田 太郎" .iItem = 0 .iSubItem = 0 .iImage = 0 lngRet = ListView_InsertItem(hList, item) ' 2つめ .pszText = "山田 花子" .iItem = 1 .iSubItem = 0 .iImage = 1 lngRet = ListView_InsertItem(hList, item) End With End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) '-- リストビューを破棄 DestroyWindow hList End Sub 標準モジュールは補足に書きます

  • VC++2008で、新規フォームアプリのメインプロジェクトの内容について

    aという名前を付けて作ったら、a.ccpの内容は以下のようになっていました。 --------- // a.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" #include "Form1.h" using namespace a; [STAThreadAttribute] int main(array<System::String ^> ^args) { // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; } --------- この、 using namespace a; の行までと//つきのコメントの行は意味は分かるのですが、 それ以外の細かい意味がよく分かりません。 ・main関数の()内にマネージ配列がこのように入っていると、結果的にどういう動作になるのでしょうか?また、return 0でどうなりますか? ・Application::EnableVisualStyles(); は、「visual スタイル」を有効にするための表記だと聞きましたが、その「visual スタイル」というのはなんなのでしょうか? ・Application::SetCompatibleTextRenderingDefault(false); というのは、スタンドアロンの Windows フォーム アプリケーション用の表記なのですよね?テキスト描画方法?に関係してる、みたいなことを見た気がしますが、具体的にはtrueにするとどうなって、falseにするとどうなるのでしょうか? ・Application::Run(gcnew Form1()); の()内は、Form1.hで実装済みのFormクラスを継承して作られていたrefクラス「Form1」のインスタンスを『無名』で作り、それに対してApplication::Runメソッドを実行する、という意味なのでしょうか?

  • エクセル マクロでの繰り返し処理について

    エクセル初心者です。エクセル2010を使用しています。 とあるホームページから、ページをコピーして、エクセルに「テキストで貼り付け」をおこない、 A列に8行の項目が入ります。この8行と次の8行の間には、自然に空白行が1行ずつ入ります。 これは、完全に手作業です。 次に、下記の作業を、マクロの自動記録を相対参照で行います。 上記のエクセルのデータを、1つめの8行のデータをコピーして(A1からA8)、C1に「行と列を入れ替え」を選択してC1からJ1に貼り付けます。 その後は、次のデータのまとまりのA10のセルに移ります。これをCtrl+a を押し続けることで、数百件か多いときは4000件ほどの並べ替えをしています。 「データがある間は、この処理を繰り返す。」 というマクロにしたいのですが、参考書等を見ながらチャレンジしてもうまくいきません。 わかる方、教えていただけますか。 以下が、マクロの自動記録でできた物です。データの個数は数百のこともあれば4000件のこともあります。 Sub 行列入れ替え8行() ' ' 行列入れ替え8行 Macro ' ' Keyboard Shortcut: Ctrl+a ' ActiveCell.Range("A1:A8").Select Selection.Copy ActiveCell.Offset(0, 2).Range("A1").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True ActiveCell.Offset(9, -2).Range("A1").Select End Sub どうぞ、ご指導よろしくお願いいたします。

  • 繰り返しの処理でエラーが出てしまいます。

    以下のマクロを組んでいるのですが、実行するとある部分でエラー表示がされてしまいます 行おうと思っていることは、 (1)修理データブック内のセルをコピーして (2)修理報告書form内のセルにコピーすることを 繰り返そうとしています。 繰り返しをbだけで行うとエラーが表示されないのですがc=0のときは正常に動くのですが、c=1のとき(繰り返したとき)にエラーが表示されてしまいます。どうしたら解決するでしょうか? Private Sub 検索ボタン_Click() Workbooks.Open ("C:\Documents and Settings\デスクトップ\修理データブック.xls") Worksheets("修理データ").Range("A1").Activate Dim 検索セル As Range ''検索セルを探す処理 Set 検索セル = Columns(1).Find(what:=入力テキスト.Value, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlColumns, MatchByte:=False) If Not 検索セル Is Nothing Then 検索セル.Select For a = 1 To 15 ''繰り返し処理1 修理報告書のB4セルからB18セルまでを埋める処理 Selection.Copy Windows("修理報告書form.xls").Activate ''修理報告書formに貼りつけする処理 Worksheets("入力フォーム").Range("B3").Select Selection.Offset(a, 0).Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False Windows("修理データブック.xls").Activate 検索セル.Select Selection.Offset(0, a).Select Next a For b = 15 To 19 Step 2 Range(ActiveCell, ActiveCell.Offset(0, 1)).Select Selection.Copy For c = 17 To 20 Windows("修理報告書form.xls").Activate Worksheets("入力フォーム").Range("B3").Select Selection.Offset(c, 0).Select Selection.PasteSpecial Paste:=xlValues ←この部分でエラーが表示されます Application.CutCopyMode = False Windows("修理データブック.xls").Activate 検索セル.Select Selection.Offset(0, b + 2).Select Next c, b どの様に回避したらよいのかを半日かけて考えたのですがどうにも分かりません。 どなたかご教授いただけますようお願いいたします

  • VBAのXML処理でメモリが足りない?

    Excel2003のVBAでMSXML2.DomDocumentを使ってXMLの処理をしています。http経由でXMLを取得し、パースして、Sheetに書き込んでいます。 XMLの行数が少ないうちは問題ないのですが、行数が1600件を超えたあたりで、LoadXML()メソッドで落ちます。 XMLを分割して、500行ずつや100行ずつLoadXMLさせても、合計処理数が1600行あたりで、必ずLoadXML()に失敗します。 メモリ不足かと思って、ループするごごとにSet Dom = Nothingのようにしてオブジェクトをクリアしていますが、効果がありません。 処理させたいXMLは最大で8000行になります。 なんとか解決策はないでしょうか? 以下、ソースの一部です。 Dim Dom As New MSXML2.DOMDocument Function get_xml_dom(query) Dim MSX As Object Set Dom = New MSXML2.DOMDocument Dim Url As String host_address = "hostname" host_path = "/keyword_report/get_keyword_data" Url = "http://" & host_address & host_path & query Set MSX = CreateObject("MSXML2.XMLHTTP") MSX.Open "GET", Url, False MSX.Send If Dom.LoadXML(MSX.responseText) Then '<- 1600件ぐらい処理させるとここで落ちる Debug.Print "Load XML is True" get_xml_dom = True Else get_xml_dom = False Debug.Print "Load XML is False" End If Set MSX = Nothing End Function このあと、DomからXPATHで要素を取り出して、シートに埋め込んでいます。