質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

3回答

1064閲覧

ListViewで、項目が1つもない場合にテキストを表示したい

koiru

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

1グッド

0クリップ

投稿2021/06/03 08:02

編集2021/06/03 10:00

前提・実現したいこと

「Windows Forms」のListViewについてです。

現在、更新ボタン押下で、とある情報(現在起動している特定のソフト)を取得し、ListViewに表示する というものを作っています。
そして、取得できた情報がなかった場合、「取得できる情報はありませんでした」的なテキストを、ListVewの中央辺りに表示したいです。
(Windowsのエクスプローラーで空のフォルダーを開けたとき、「このフォルダーは空です。」と表示されるのですが、これと同じような感じにしたいです)

これは、どうすればできるのでしょうか?
ListViewのプロパティをざっと見ましたが、そういう設定は見当たりませんでした。
C#を初めて2週間ちょっと、オブジェクト指向も詳しくは理解できていませんが、お手柔らかにお願いします。

該当のソースコード

「とある情報を取得して表示」は、「50%の確率で表示」に置き換えています。

Form1.Designer.cs

C#

1namespace ListView 2{ 3 partial class Form1 4 { 5 /// <summary> 6 /// 必要なデザイナー変数です。 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// 使用中のリソースをすべてクリーンアップします。 12 /// </summary> 13 /// <param name="disposing">マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param> 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 base.Dispose(disposing); 21 } 22 23 #region Windows フォーム デザイナーで生成されたコード 24 25 /// <summary> 26 /// デザイナー サポートに必要なメソッドです。このメソッドの内容を 27 /// コード エディターで変更しないでください。 28 /// </summary> 29 private void InitializeComponent() 30 { 31 this.listView1 = new System.Windows.Forms.ListView(); 32 this.button1 = new System.Windows.Forms.Button(); 33 this.SuspendLayout(); 34 // 35 // listView1 36 // 37 this.listView1.HideSelection = false; 38 this.listView1.Location = new System.Drawing.Point(12, 12); 39 this.listView1.Name = "listView1"; 40 this.listView1.Size = new System.Drawing.Size(460, 411); 41 this.listView1.TabIndex = 0; 42 this.listView1.UseCompatibleStateImageBehavior = false; 43 // 44 // button1 45 // 46 this.button1.Location = new System.Drawing.Point(12, 429); 47 this.button1.Name = "button1"; 48 this.button1.Size = new System.Drawing.Size(460, 23); 49 this.button1.TabIndex = 1; 50 this.button1.Text = "ListViewの更新"; 51 this.button1.UseVisualStyleBackColor = true; 52 this.button1.Click += new System.EventHandler(this.button1_Click); 53 // 54 // Form1 55 // 56 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 57 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 58 this.ClientSize = new System.Drawing.Size(484, 461); 59 this.Controls.Add(this.button1); 60 this.Controls.Add(this.listView1); 61 this.Name = "Form1"; 62 this.Text = "Form1"; 63 this.Load += new System.EventHandler(this.Form1_Load); 64 this.ResumeLayout(false); 65 66 } 67 68 #endregion 69 70 private System.Windows.Forms.ListView listView1; 71 private System.Windows.Forms.Button button1; 72 } 73}

Form1.cs

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace ListView 12{ 13 public partial class Form1 : Form 14 { 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 20 private void Form1_Load(object sender, EventArgs e) 21 { 22 23 } 24 25 private void button1_Click(object sender, EventArgs e) 26 { 27 listView1.Items.Clear(); 28 29 Random random = new System.Random(); 30 if (random.Next(0, 2) == 0) 31 { 32 listView1.Items.Add("項目"); 33 } 34 } 35 } 36}

環境

  • .NET Framework 4.7.2
  • Visual Studio 2019
TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/06/03 08:13

で、しつもんはなんでしょうか
退会済みユーザー

退会済みユーザー

2021/06/03 08:14

何を作っているのでしょう? WinFroms? WPF? ASP.NET Web Forms? ListView はそのいずれにもあって(もちろんそれぞれ違う ListView ですが)、ListView と言うだけでは分からないのですよ。 あと、どこまで自分で実装できていて、どこで躓いていて、何が分かれば解決するか、できれば自分が書いたコードをアップして、説明してください。今の質問内容では丸投げでマイナス評価対象です。
退会済みユーザー

退会済みユーザー

2021/06/03 09:30

> 現在、更新ボタン押下で、とある情報を取得し、ListViewに表示する というものを作っています。 「とある情報」とは具体的に何ですか? それによっては XY 問題になっているかもしれませんよ。
koiru

2021/06/03 09:38 編集

「現在起動している特定のソフト」です。XY問題にはなっていないと思いますが……
退会済みユーザー

退会済みユーザー

2021/06/03 13:17 編集

> 「現在起動している特定のソフト」です。XY問題にはなっていないと思いますが…… それが何なのか分かりませんが、ユーザーに「取得できた情報がなかった」ことを通知するなら ListView 上でなくても、他の方法、例えば MessageBox を使った方が良いのでは? もし、MessageBox の方が適切ということであれば XY 問題とまでは言えないかもしれませんがそれに近いのでは? さらに、「とある情報」が何かによっては、それを表示するのに ListView を使うのが適切かどうかという話にまで遡るかもしれませんし。
guest

回答3

0

ベストアンサー

あまり意味は分かっていませんが、こちらがズバリな感じです。
c# - Display empty text when there are no items in ListView Windows forms - Stack Overflow

入れ替え手順

  1. MyListViewクラスをForm1の下か別ファイル(MyListView.cs)に書く
  2. 一度実行(ビルド)
  3. デザイナでlistView1を削除し、ツールボックスに新たに出たMyListViewを追加(反映に少し時間がかかる場合あり)
  4. EmptyTextに好きなメッセージをいれる
  5. (Name)myListView1になっているので、listView1に変える

以上

cs

1using System; 2using System.ComponentModel; 3using System.Drawing; 4using System.Windows.Forms; 5 6namespace Questions341965 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 } 14 15 private void Form1_Load(object sender, EventArgs e) { } 16 17 private void button1_Click(object sender, EventArgs e) 18 { 19 listView1.Items.Clear(); 20 21 var random = new System.Random(); 22 if (random.Next(0, 2) == 0) 23 { 24 listView1.Items.Add("項目"); 25 } 26 } 27 } 28 29 // [c# - Display empty text when there are no items in ListView Windows forms - Stack Overflow](https://stackoverflow.com/questions/41076244/display-empty-text-when-there-are-no-items-in-listview-windows-forms) 30 public class MyListView : ListView 31 { 32 public MyListView() 33 { 34 EmptyText = "No data available."; 35 } 36 37 [DefaultValue("No data available.")] 38 public string EmptyText { get; set; } 39 40 protected override void WndProc(ref Message m) 41 { 42 base.WndProc(ref m); 43 if (m.Msg == 0xF) 44 { 45 if (Items.Count == 0) 46 { 47 using (var g = Graphics.FromHwnd(Handle)) 48 { 49 //ど真ん中 50 //TextRenderer.DrawText(g, EmptyText, Font, ClientRectangle, ForeColor); 51 52 // 上部中央 53 TextRenderer.DrawText(g, EmptyText, Font, ClientRectangle, ForeColor, 54 TextFormatFlags.HorizontalCenter | TextFormatFlags.WordBreak); 55 } 56 } 57 } 58 } 59 } 60}

デザイナ画面

投稿2021/06/03 10:40

編集2023/07/27 14:44
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koiru

2021/06/03 11:57

できました! ありがとうございました!
guest

0

あまり良いやり方とは言えませんが、1つの考え方として書いておきます。
OwnerDrawを使うのですが、Itemsが0個の時DrawItemが呼ばれないので、dummyItemを追加することにしてみました。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace TeraEmptyListViewText { 12 public partial class Form1 : Form { 13 ListViewItem dummyItem = new ListViewItem(new[] { "dummy", "dummy item", "あり得ないアイテム" }); 14 public Form1() { 15 InitializeComponent(); 16 17 listView1.OwnerDraw = true; 18 19 listView1.DrawItem += (s, e) => { 20 if (listView1.Items.Count == 1 && listView1.Items[0] == dummyItem) { 21 StringFormat sf = new StringFormat(); 22 sf.Alignment = StringAlignment.Center; 23 sf.LineAlignment = StringAlignment.Center; 24 e.Graphics.DrawString("データがありません。", listView1.Font, Brushes.Black, e.Graphics.VisibleClipBounds, sf); 25 } else 26 e.DrawDefault = true; 27 }; 28 listView1.Items.Add(dummyItem); 29 } 30 31 private void button1_Click(object sender, EventArgs e) { 32 listView1.Items.Clear(); 33 34 Random random = new System.Random(); 35 if (random.Next(0, 2) == 0) { 36 listView1.Items.Add("項目"); 37 } else 38 listView1.Items.Add(dummyItem); 39 } 40 } 41}

投稿2021/06/03 11:21

Hey_CH

総合スコア437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koiru

2021/06/03 12:08

回答ありがとうございました。
guest

0

適当に

「取得できる情報はありませんでした」

を表示する用の Label でも重ねておいてそいつのVisibleを制御してやる,というのが最も手っ取り早いように思います.

投稿2021/06/03 10:33

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koiru

2021/06/03 11:59

なるほど。回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問