none
datagridview に表示される文字列の編集について RRS feed

  • 質問

  • お世話になります。

    クエリで抽出したデータを datagridview に表示しています。

    ここに表示される文字列データを、Substring(0, 16) のような感じで
    一部編集(カットなど)して表示するには、どのような方法があるので
    しょうか?

    ご教授下さいますよう、宜しくお願い致します。

    2010年9月6日 6:33

回答

  • TH01さんが以下で触れられていますが、DataGridViewのCellFormatting イベントや CellParsingイベントを使う方法、

    TableAdapterを利用する場合の文字列操作
    http://social.msdn.microsoft.com/Forums/ja-JP/vbexpressja/thread/862bc043-237b-4d96-b309-d8902e6c2a1a

    DataGridViewのCellPaintingイベントで好きなように描いてしまう方法、

    DataGridViewのセル表示について
    http://dobon.net/vb/bbs/log3-37/22558.html

    SQL文で最初から切り捨ててしまう方法(T-SQLであればsubstring)などを思いつきます。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年9月6日 7:40
    モデレータ
  • 既に対処されたとのことですが、一応方法を書かせていただきます。

    表示する為に値を加工するのでしたら、CellFormatting イベントが使用できます。
    新規作成したプロジェクトの Form1 のコードを、以下に差し替えて実行してみてください。
    (このサンプルでは DataTable や DataGridView を動的に作成していますが、重要なのは CellFormatting イベント内のコードです。)

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            var dt = new DataTable();
            dt.Columns.Add("col1", typeof(string));
            dt.Rows.Add("12345678901234567890");
            dt.Rows.Add("12345678901234567890");

            dataGridView1 = new DataGridView();
            this.Controls.Add(dataGridView1);
            dataGridView1.DataSource = dt;

            dataGridView1.CellFormatting += dataGridView1_CellFormatting;
        }

        private DataGridView dataGridView1;

        private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (dataGridView1.Columns[e.ColumnIndex].DataPropertyName == "col1")
            {
                // e.Value には表示予定の値が格納されています。
                // これを実際に表示したい値に変更すると、それが表示されます。
                // 元の(今回の場合は DataTable の)データが変化するわけではなく、
                // 表示だけに影響します。
                // 今回は不要ですが、e.FormattingApplied = true; も必要により行います。
                var value = (e.Value ?? "").ToString();
                if (value.Length > 16)
                    e.Value = value.Substring(0, 16);
            }
        }
    }

    2010年9月9日 8:49

すべての返信

  • TH01さんが以下で触れられていますが、DataGridViewのCellFormatting イベントや CellParsingイベントを使う方法、

    TableAdapterを利用する場合の文字列操作
    http://social.msdn.microsoft.com/Forums/ja-JP/vbexpressja/thread/862bc043-237b-4d96-b309-d8902e6c2a1a

    DataGridViewのCellPaintingイベントで好きなように描いてしまう方法、

    DataGridViewのセル表示について
    http://dobon.net/vb/bbs/log3-37/22558.html

    SQL文で最初から切り捨ててしまう方法(T-SQLであればsubstring)などを思いつきます。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年9月6日 7:40
    モデレータ
  • trapemiya さん、有難うございました。

    色んな方法があるようで、教えて頂いた URLを読ませて頂き、色々とトライ
    してみたのですが、残念ながら私の知識では十分理解が伴いませんでした。

    何かきっかけを掴んで、次の質問ができるにも至らない状態で、もう少し
    知識を深めてから再挑戦するのが良いのかなと思っています。

    目的を達成するためには、とりあえずテーブルに1カラム増やし、レコード
    をインサート作る際に表示したい文字列をあらかじめ作っておき、これを
    先に追加したカラムに保存しておく事にしました。
    (少々、みっともないですが・・・)

    そんな事で、折角お教え頂いたアドバイスを生かせず、申し訳ありません。
    もう少し知識が深まり、的確な質問ができるようになった時には、また質問
    させて頂こうと思っています。

    その節にはどうぞ宜しくお願いいたします。
    有難うございました。

    2010年9月9日 7:33
  • 既に対処されたとのことですが、一応方法を書かせていただきます。

    表示する為に値を加工するのでしたら、CellFormatting イベントが使用できます。
    新規作成したプロジェクトの Form1 のコードを、以下に差し替えて実行してみてください。
    (このサンプルでは DataTable や DataGridView を動的に作成していますが、重要なのは CellFormatting イベント内のコードです。)

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            var dt = new DataTable();
            dt.Columns.Add("col1", typeof(string));
            dt.Rows.Add("12345678901234567890");
            dt.Rows.Add("12345678901234567890");

            dataGridView1 = new DataGridView();
            this.Controls.Add(dataGridView1);
            dataGridView1.DataSource = dt;

            dataGridView1.CellFormatting += dataGridView1_CellFormatting;
        }

        private DataGridView dataGridView1;

        private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (dataGridView1.Columns[e.ColumnIndex].DataPropertyName == "col1")
            {
                // e.Value には表示予定の値が格納されています。
                // これを実際に表示したい値に変更すると、それが表示されます。
                // 元の(今回の場合は DataTable の)データが変化するわけではなく、
                // 表示だけに影響します。
                // 今回は不要ですが、e.FormattingApplied = true; も必要により行います。
                var value = (e.Value ?? "").ToString();
                if (value.Length > 16)
                    e.Value = value.Substring(0, 16);
            }
        }
    }

    2010年9月9日 8:49
  • TH01さん、こんばんは!

    ご親切に、分かり易いサンプルをお示しくださり、ありがとう御座います。

    早速試してみました。
    奥深い所まで理解するのはまだまだですが、使い方はよく分かりました。

    先にも書きましたが、取りあえず急場しのぎで無理矢理乗り切ったのですが、
    改めて、教えて頂いた方法に書き換えました。

    どうも、ありがとう御座いました。
    今後とも、どうぞ宜しくお願いいたします。

    2010年9月9日 16:18