.NET TIPS

DataGridコントロールを使用したフォームを常に最前面に表示するには?

デジタルアドバンテージ
2004/07/16

 「TIPS:ウィンドウを常に最前面に表示するには?」では、フォームのTopMostプロパティの設定によるウィンドウの最前面(最上位)表示について示した。しかし、フォームにDataGridコントロールを配置している場合には、TopMostプロパティを設定していても常に最前面表示されなくなるという問題が発生する。これは.NET Frameworkクラス・ライブラリのバグであると思われるが、本稿ではこの問題を回避する方法について示す。

 詳細は不明なのだが、この問題はDataGridコントロールにおける内部処理でフォームの最前面表示の状態を無効にしてしまっていることが原因のようである。このため、フォームのTopMostプロパティがtrueとなっているにもかかわらず、ウィンドウは通常表示となる。

 この問題を回避するには、通常、プログラムの最初あるいはフォームのデザイン時でのみ行えばよいTopMostプロパティ設定を、DataGridコントロールが再描画されるたびに行うようにすればよい。具体的には、DataGridコントロールのPaintイベントのイベント・ハンドラでTopMostプロパティの再設定を行うようにする。この方法を実装したサンプル・プログラムを次に示す(ポイントとなるのは太字の部分のみである)。

// topmostdg.cs

using System;
using System.Data;
using System.Windows.Forms;

public class TopMostDataGridForm : Form {
  DataGrid dataGrid1;

  public TopMostDataGridForm () {
    this.dataGrid1 = new DataGrid();
    this.dataGrid1.Dock = DockStyle.Fill;
    this.dataGrid1.Paint
      += new PaintEventHandler(this.dataGrid1_Paint);

    this.Controls.Add(dataGrid1);

    this.TopMost = true;
    this.Text = "最前面表示DataGrid";
    this.Load += new EventHandler(this.Form_Load);
  }

  static void Main() {
    Application.Run(new TopMostDataGridForm());
  }

  void Form_Load(object sender, EventArgs e) {
    // Insider.NETのRSS情報をDataGridに表示
    DataSet ds = new DataSet();
    ds.ReadXml("http://www.atmarkit.co.jp/rss/fdotnet/rss2dc.xml");
    this.dataGrid1.DataSource = ds.Tables["item"];
  }

  void dataGrid1_Paint(object sender, PaintEventArgs e) {
    this.TopMost = true;
  }
}

// コンパイル方法:csc topmostdg.cs
DataGridコントロールを配置したフォームを常に最前面表示するC#のサンプル・プログラム(topmostdg.cs)
 
' topmostgd.vb

Imports System
Imports System.Data
Imports System.Windows.Forms

Public Class TopMostDataGridForm
  Inherits Form

  WithEvents DataGrid1 As DataGrid

  Shared Sub Main()
    Application.Run(New TopMostDataGridForm)
  End Sub

  Public Sub New()
    Me.DataGrid1 = New DataGrid
    Me.DataGrid1.Dock = DockStyle.Fill

    Me.Controls.Add(Me.DataGrid1)

    Me.Text = "最前面表示DataGrid"
    Me.TopMost = True
  End Sub

  Private Sub TopMostDataGridForm_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    ' Insider.NETのRSS情報をDataGridに表示
    Dim ds As DataSet = New DataSet
    ds.ReadXml("http://www.atmarkit.co.jp/rss/fdotnet/rss2dc.xml")
    Me.DataGrid1.DataSource = ds.Tables("item")
  End Sub

  Private Sub DataGrid1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles DataGrid1.Paint
    Me.TopMost = True
  End Sub
End Class

' コンパイル方法:vbc /r:System.dll /r:System.Xml.dll /r:System.Data.dll /r:System.Windows.Forms.dll topmostdg.vb
DataGridコントロールを配置したフォームを常に最前面表示するVB.NETのサンプル・プログラム(topmostdg.vb)

 このサンプル・プログラムを実行すると、次のようなウィンドウが常に最前面に表示される。

DataGridコントロールを配置し、TopMostプロパティをtrueに設定したフォーム
背後にあるアプリケーションをアクティブにしても、ウィンドウは隠れない。

 なお、DataGridコントロールで表示しているデータについては、「TIPS:[ASP.NET]DataGridコントロールでデータセットを表示するには?」の「RSS情報をデータセットに読み込むには」で解説している。End of Article

カテゴリ:Windowsフォーム 処理対象:DataGridコントロール
カテゴリ:Windowsフォーム 処理対象:ウィンドウ
使用ライブラリ:Formクラス(System.Windows.Forms名前空間)
関連TIPS:ウィンドウを常に最前面に表示するには?
関連TIPS:
[ASP.NET]DataGridコントロールでデータセットを表示するには?
 
この記事と関連性の高い別の.NET TIPS
ウィンドウを常に最前面に表示するには?
Windowsフォームでコントロールの配置や重なりを調整するには?
[ASP.NET]DataGridコントロールでデータセットを表示するには?
DataGridコントロールで行の追加/削除およびデータ編集を禁止するには?
[ASP.NET]DataGridコントロールの編集用テキストボックスを大きくするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間