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

■34959 / 親記事)  DataGridViewのセル結合部分にボタンを表示する方法
  
□投稿者/ り 一般人(1回)-(2021/11/16(Tue) 12:03:00)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 


    初めて投稿させていただきます。

    タイトルの通りの内容ですが、
    CellPaintハンドラでセルを結合しているように表示させて、
    結合したセルの中にボタンを配置したいのですが、

    現在のソースは、DBからデータを抽出してDataGridViewに表示しようとしているので、
    DataGridView.DataSouced = dt;
    でデータを格納し、そのあとにCellPaintが動く形で記述しています。

    しかし、それだとボタンがTextの形で表示されてしまいボタンとしての機能が
    失われていしまいます。

    どうにかいい方法はないでしょうか...
    添付のようにしたいです。

マルチポストを報告
違反を報告
引用返信 削除キー/
■34960 / ResNo.1)  Re[1]: DataGridViewのセル結合部分にボタンを表示する方法
□投稿者/ 魔界の仮面弁士 大御所(1410回)-(2021/11/16(Tue) 13:04:37)
  • アイコンNo34959に返信(りさんの記事)
    > でデータを格納し、そのあとにCellPaintが動く形で記述しています。
    描画先となる該当セルのインスタンスは、どのようなデータ型にしていますか?

    DataGridViewButtonCell あるいはその継承クラスなのか、
    DataGridViewTextBoxCell あるいはその継承クラスなのか、
    それとも素の DataGridViewCell クラスから実装しているのか。


    > しかし、それだとボタンがTextの形で表示されてしまい
    どういうコードを書いているのか、一切の説明が無いので
    状況が分からないです。

    ボタンセルということは、そもそもユーザーによる編集は
    不要なのですから、Text を選択できるようにしておく必要もないのですよね。

    > ボタンとしての機能が失われていしまいます。
    具体的には、どういう結果を期待しているのに、
    実際にはどうなってしまうのでしょうか?
違反を報告
引用返信 削除キー/
■34961 / ResNo.2)  Re[2]: DataGridViewのセル結合部分にボタンを表示する方法
□投稿者/ り 一般人(2回)-(2021/11/16(Tue) 13:31:41)
  • アイコンNo34960に返信(魔界の仮面弁士さんの記事)

    迅速に回答くださりありがとうございます!
    説明不足ですみません。

    > ■No34959に返信(りさんの記事)
    >>でデータを格納し、そのあとにCellPaintが動く形で記述しています。
    > 描画先となる該当セルのインスタンスは、どのようなデータ型にしていますか?
    >
    > DataGridViewButtonCell あるいはその継承クラスなのか、
    > DataGridViewTextBoxCell あるいはその継承クラスなのか、
    > それとも素の DataGridViewCell クラスから実装しているのか。

    DataGridViewButtonCellで実装しようとしています。

    >
    >
    >>しかし、それだとボタンがTextの形で表示されてしまい
    > どういうコードを書いているのか、一切の説明が無いので
    > 状況が分からないです。
    > ボタンセルということは、そもそもユーザーによる編集は
    > 不要なのですから、Text を選択できるようにしておく必要もないのですよね。

    コードは次に記載します。

    >>ボタンとしての機能が失われていしまいます。
    > 具体的には、どういう結果を期待しているのに、
    > 実際にはどうなってしまうのでしょうか?



    実装したいイメージは先ほど挙げている通りですが、
    現状は今回添付したファイルのようになります。

570×335 => 250×146
イメージ
1637037101.png
/6KB
違反を報告
引用返信 削除キー/
■34963 / ResNo.3)  Re[3]: DataGridViewのセル結合部分にボタンを表示する方法
□投稿者/ り 一般人(3回)-(2021/11/17(Wed) 09:33:12)
  • アイコンNo34961に返信(りさんの記事)
    現在記述しているコードは以下の感じです。

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace Learning
    {
    public partial class frmGrid : Form
    {

    private string[,] strTitle = new string[,] {
    { "A", "B", "C", "D" },
    { "E", "", "", "F" } };


    /// <summary>
    /// 検索
    /// </summary>
    private void SearchResult()
    {
    DataTable dt = new DataTable();
    string strSql;

    strSql = CreateSql();

    dt = CMNUtil.ExecSql(strSql);
    CreateViewData(dt);

    }


    /// <summary>
    /// DataGridView作成
    /// </summary>
    /// <param name="dt"></param>
    private void CreateViewData(DataTable dt)
    {
    DataLoad(dt);
    AttachHeaderEvent();
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="dt"></param>
    private void DataLoad(DataTable dt)
    {
    DataTable vwDt = new DataTable();
    DataRow row;
    vwDt = CreateColumn();
    string[] strCol = new string[dt.Columns.Count - 1];

    for (int i = 0; i < 2; i++)
    {
    //ヘッダー用
    row = vwDt.NewRow();
    row["A"] = SetData(null, 0, i, true);
    row["B"] = SetData(null, 1, i, true);
    row["C"] = SetData(null, 2, i, true);
    row["D"] = SetData(null, 3, i, true);
    vwDt.Rows.Add(row);
    }


    foreach (DataRow dr in dt.Rows)
    {
    for (int i = 0; i < 2; i++)
    {

    row = vwDt.NewRow();
    row["A"] = SetData(dr, 0, i);
    row["B"] = SetData(dr, 1, i);
    row["C"] = SetData(dr, 2, i);
    row["D"] = SetData(dr, 3, i);
    vwDt.Rows.Add(row);
    }
    }
    dataGridView1.DataSource = vwDt;
    DataGridViewButtonColumn btnSel = new DataGridViewButtonColumn();
    btnSel.Name = "btnSelect";
    btnSel.UseColumnTextForButtonValue = true;
    btnSel.Text = "選択";
    btnSel.HeaderText = string.Empty;
    dataGridView1.Columns.Insert(0, btnSel);

    }


    /// <summary>
    /// イベントハンドラ作成
    /// </summary>
    private void AttachHeaderEvent()
    {
    dataGridView1.CellPainting += (s, e) =>
    {

    DataGridView dv = (DataGridView)s;
    Rectangle rect;
    DataGridViewCell cell;

    rect = e.CellBounds;
    int intWidth = 0;

    if (e.ColumnIndex == 0)
    {
    if (e.RowIndex % 2 == 0)
    {
    cell = dataGridView1[e.ColumnIndex, e.RowIndex + 1];
    //1つ下のセルの高さを足す
    rect.Height += cell.Size.Height;
    }
    //偶数行の処理
    else
    {
    cell = dataGridView1[e.ColumnIndex, e.RowIndex - 1];
    //一つ上のセルの高さを足し、矩形の座標も一つ上のセルに合わせる
    rect.Height += cell.Size.Height;
    rect.Y -= cell.Size.Height;
    }
    //セルボーダーライン分矩形の位置を補正
    rect.X -= 1;
    rect.Y -= 1;
    //背景、セルボーダーライン、セルの値を描画
    e.Graphics.FillRectangle(
    new SolidBrush(e.CellStyle.BackColor), rect);
    e.Graphics.DrawRectangle(
    new Pen(dv.GridColor), rect);
    TextRenderer.DrawText(e.Graphics, cell.FormattedValue.ToString(), e.CellStyle.Font, rect, e.CellStyle.ForeColor, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
    e.Handled = true;
    }

    //2列目と3列目の結合処理
    else if (e.ColumnIndex == 1)
    {
    if (e.RowIndex % 2 == 0)
    e.Paint(e.ClipBounds, e.PaintParts);
    else
    {
    rect = e.CellBounds;
    for (int i = 0; i < 3; i++)
    {
    cell = dataGridView1[e.ColumnIndex + i, e.RowIndex];
    intWidth += cell.Size.Width;
    }
    rect.Width = intWidth;
    rect.X -= 1;
    rect.Y -= 1;

    e.Graphics.FillRectangle(new SolidBrush(e.CellStyle.BackColor), rect);

    e.Graphics.DrawRectangle(new Pen(dv.GridColor), rect);

    TextRenderer.DrawText(e.Graphics, e.FormattedValue.ToString(),
    e.CellStyle.Font, rect, e.CellStyle.ForeColor,
    TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
    e.Handled = true;
    }
    }
    else
    {
    if ((e.ColumnIndex != 1 && e.ColumnIndex != 4) && e.RowIndex % 2 != 0)
    e.Handled = true;
    }
    //2段目を結合しているように見せる
    if (e.RowIndex == 1 && e.ColumnIndex < 3)
    {
    e.AdvancedBorderStyle.Left = DataGridViewAdvancedCellBorderStyle.None;
    e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.None;

    if (e.ColumnIndex < dataGridView1.Columns.Count - 1 && Convert.ToString(dataGridView1.Rows[1].Cells[e.ColumnIndex + 1].Value) != "")
    e.AdvancedBorderStyle.Right = DataGridViewAdvancedCellBorderStyle.Single;
    }


    SetGridStyle();
    };



    }

    /// <summary>
    /// Headerの設定
    /// </summary>
    private void SetGridStyle()
    {
    //GridViewの色等の設定を記述
    }



    /// <summary>
    /// DataRowに値格納
    /// </summary>
    /// <param name="dr">DataRow</param>
    /// <param name="col">列番号</param>
    /// <param name="row">行番号</param>
    /// <param name="flg">フラグ(ヘッダー判別用)</param>
    /// <returns></returns>
    private string SetData(DataRow dr, int col, int row, bool flg = false)
    {
    //とってきた値を格納
    }



    /// <summary>
    /// 表示用データテーブル作成
    /// </summary>
    /// <returns></returns>
    private DataTable CreateColumn()
    {
    DataTable retDt = new DataTable();

    retDt.Columns.Add("A", typeof(string));
    retDt.Columns.Add("B", typeof(string));
    retDt.Columns.Add("C", typeof(string));
    retDt.Columns.Add("D", typeof(string));

    return retDt;
    }

    }

違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -