5

この質問はここで何度も尋ねられますが、彼らの答えは私にとってはうまくいきません。

表形式でデータを表示するために C# DataGridView を使用しています。私はいくつかの8/9列と約25から30行を持っています。列ごとに、カスタマイズされた幅を設定しています (画面全体の幅の一部で、列ごとに異なります)。それを達成するために、次のプロパティを設定しました

    view1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;

また、私のアプリケーションは、すべての行を同時に表示することはできませんが、no. 一度にユーザーが定義した行の数であり、そのためにタイマーで scrollindex プロパティを使用してビューをスクロールしています。また、行の高さをカスタマイズしました(画面全体の高さの一部)。したがって、すべての行を同時に表示しないようにするには、次のプロパティを使用しています

    view1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

ラッピングに使っています

    view1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;

ただし、上記のプロパティは、間にスペースがある単語のみをラップしますが、単一の長い単語はラップしません。

では、上記の行と列のサイズのプロパティで単一の長い単語をラップする方法は? 多くの場所で、私は使用するようにアドバイスを受けています

    view1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
    view1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;

しかし、 AutoSizeColumnsMode で 'none' 以外のものを使用すると、列のカスタマイズされた幅が変更され、 AutoSizeRowsMo​​de で 'none' 以外のものを使用すると、一度にすべての行が表示され、行のカスタマイズされた高さが変更されます。

誰でもこの問題を解決する方法を知っていますか?

注: デスクトップ アプリケーション (Windows フォーム アプリケーション) です。

4

3 に答える 3

4

DataGridViewCellPaintingイベントを使用します。サンプルコード:

 public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
        dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;

        //dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
        //dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
        //dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            row.Cells[0].Value = "CELL123456789012345679801234567890";
            row.Cells[1].Value = "CELL 1";
            row.Cells[2].Value = "CELL 2";
            row.Cells[3].Value = "CELL 3";
            row.Cells[4].Value = "CELL 4";
            row.Cells[5].Value = "CELL 5";
        }

    }

    private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        if (e.Value == null)
            return;
        var s = e.Graphics.MeasureString(e.Value.ToString(), dataGridView1.Font);
        if (s.Width > dataGridView1.Columns[e.ColumnIndex].Width)
        {
            using (
      Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor),
      backColorBrush = new SolidBrush(e.CellStyle.BackColor))
            {
                e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
                e.Graphics.DrawString(e.Value.ToString(), dataGridView1.Font, Brushes.Black, e.CellBounds, StringFormat.GenericDefault);
                dataGridView1.Rows[e.RowIndex].Height = (int)(s.Height * Math.Ceiling(s.Width / dataGridView1.Columns[e.ColumnIndex].Width));
                e.Handled = true;
            }
        }
    }

改善されたコード:

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        if (e.Value == null)
            return;

        var s = e.Graphics.MeasureString(e.Value.ToString(), dataGridView1.Font);

        if (s.Width > dataGridView1.Columns[e.ColumnIndex].Width)
        {
            using (Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor), backColorBrush = new SolidBrush(e.CellStyle.BackColor))
                {
                    using (Pen gridLinePen = new Pen(gridBrush))
                    {
                        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right, e.CellBounds.Bottom - 1);
                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);

                        e.Graphics.DrawString(e.Value.ToString(), dataGridView1.Font, Brushes.Black, e.CellBounds, StringFormat.GenericDefault);

                        dataGridView1.Rows[e.RowIndex].Height = (int)(s.Height * Math.Ceiling(s.Width / dataGridView1.Columns[e.ColumnIndex].Width));

                        e.Handled = true;
                    }

                }
        }
    }
于 2013-01-18T08:25:29.793 に答える
1

次のようなものを試してください

view.Columns[int_Desired_Column_Index].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
于 2013-01-18T08:27:18.870 に答える
1

おそらくこれは良い解決策ではありませんが、試すことができます:

 private void Form1_Load(object sender, EventArgs e)
        {


            var source = new BindingSource();
            List<MyStruct> list = new List<MyStruct> { new MyStruct("cell 123456789012345678901234567890", "qsdsqdsqdsqdsqdb"), 
                new MyStruct("c", "d") };
            source.DataSource = list;
            dataGridView1.DataSource = source;



        }
        class MyStruct
        {
            public string Name { get; set; }
            public string Adres { get; set; }


            public MyStruct(string name, string adress)
            {
                Name = name;
                Adres = adress;
            }
        }

ここに画像の説明を入力 ここに画像の説明を入力

于 2013-01-18T09:38:12.273 に答える