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

DataGridのスタイルに関して

分類:[.NET]

DataGridのスタイルに関してですが,以下のことはできないものでしょうか?

@列ヘッダーテキストの横配置を中央にすることはできないか
 (データの配置は右詰あるいは左詰のまま)
A行ヘッダーテキストを任意に設定する(例えば1,2,3など)ことはできないか

非常に初歩的な質問ですみません.
■No1847に返信(TYさんの記事)
> DataGridのスタイルに関してですが,以下のことはできないものでしょうか?
>
> @列ヘッダーテキストの横配置を中央にすることはできないか
>  (データの配置は右詰あるいは左詰のまま)
> A行ヘッダーテキストを任意に設定する(例えば1,2,3など)ことはできないか
>
> 非常に初歩的な質問ですみません.

私もWindows FormでDataGridを使って開発時、同様の疑問にぶち当たり、
解決出来ていない状況です。
.NETともあろうものが、こんな事を実現出来ないはずがありません。
どなたか有識者の方、是非是非ご教示お願い申し上げます!!!!
私は,無理なのかなと思って,あきらめてしまいました…
簡単なスプレッドシートのようなものを作るのに利用できないかと
DataGridをあれこれいじってみましたが,やっぱりデータ表示用だけに
どうもつかいにくい.
今は,自作でスプレッドシートもどきをつくっています.
しかし,これも苦心してますけどね.
いや、無理なら無理、出来ない出来ないっていうのであれば
誰かそれを宣言してくれるとか、MSが公式に発表するとか。
データ表示用と言っても普通に考えれば見出しの無い
データだけ羅列するのなんて考えられないっすよね!?
このスレにも誰もレスつけないって事は、そういう需要が無いんですかね?
見殺し状態は良くないって思うわけで…。
私の知る限り、DataGridで列ヘッダとデータ部分の配置方法を変えること、および、行ヘッダにテキストをつけるといったことは両方ともできないようです。時間がありましたら、もう少し良く調べてみます。
FLOWER KINGさん,管理人さん,ありがとうございます.
FLOWER KINGさんのお気持ち,大変うれしく思います.
そうですね.できないということがわかっていれば,もっとはやくDataGridを
あきらめてましたね.その後,調べたり試行錯誤してた時間がロスとなりました.
(ただ,レスがつかないのは,しょうがないかな,と)

この件に関しては,いろんな掲示板の過去ログを探してみましたが,
見つけられませんでした(探し足りないかもしれませんが).
管理人さんの知識と情報網ではっきりしたことがわかれば,教えてください.

このスレッドが,同様の課題を抱えた人のヒントになれば,いいですね.
■No1921に返信(TYさんの記事)
前回の投稿後考え付いたのですが、

> @列ヘッダーテキストの横配置を中央にすることはできないか
>  (データの配置は右詰あるいは左詰のまま)

について、ヘッダの配列はAlignmentに任せ、データ部分の配列をPaintメソッドを
オーバーライドして自分で描画することによりどうにかするというのはどうでしょうか。

この考え方でDataGridTextBoxColumnからの派生クラスを作ってみました。
データの配置をDataAlignmentプロパティで設定できるようになっています。
お気づきの点がありましたら、教えてください。

(ここから)---------------------------
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Data;

namespace Dobon.Samples.Forms
{
    public class MyDataGridTextBoxColumn : DataGridTextBoxColumn
    {
        Point _margin = new Point(0, 1);  
        HorizontalAlignment _dataAlignment = HorizontalAlignment.Left;
        public HorizontalAlignment DataAlignment
        {
            get
            {
                return _dataAlignment;
            }
            set
            {
                _dataAlignment = value;
            }
        }

        protected override void Edit(
            CurrencyManager source,
            int rowNum,
            Rectangle bounds,
            bool readOnly,
            string instantText,
            bool cellIsVisible)
        {
            base.Edit(source, rowNum, bounds, readOnly,
                instantText, cellIsVisible);
            this.TextBox.TextAlign = _dataAlignment;
        }

        protected override void Paint(
            Graphics g,
            Rectangle bounds,
            CurrencyManager source,
            int rowNum,
            Brush backBrush,
            Brush foreBrush,
            bool alignToRight)
        {
            string text = GetColumnValueAtRow(source, rowNum).ToString();

            StringFormat sf = new StringFormat();
            switch (_dataAlignment)
            {
                case HorizontalAlignment.Left:
                    sf.Alignment = StringAlignment.Near;
                    break;
                case HorizontalAlignment.Center:
                    sf.Alignment = StringAlignment.Center;
                    break;
                case HorizontalAlignment.Right:
                    sf.Alignment = StringAlignment.Far;
                    break;
            }
            sf.FormatFlags = StringFormatFlags.NoWrap;
            if (alignToRight)
                sf.FormatFlags |= StringFormatFlags.DirectionRightToLeft;

            Rectangle rect = bounds;

            g.FillRectangle(backBrush, rect);
            
            rect.Offset(_margin);
            rect.Inflate(-_margin.X * 2, -_margin.Y * 2);

            g.DrawString(text, this.DataGridTableStyle.DataGrid.Font,
                foreBrush, (RectangleF) rect, sf);

            sf.Dispose();
        }
    }
}
管理人様。
ご教示有難うございます。

大変お手数ですが、VB.NET版のソースも提示して頂けましたら
非常に助かります。
甘えるな!のお叱りを覚悟で投稿させて頂きました。

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