10

WrapModeのをtrueに設定できることはわかっていますDefaultCellStyleRowTemplate、これでは希望する動作が得られません。各セル内の文字列のリストを表示しているので、キャリッジリターンを認識したいのですが、長いアイテムのテキストを折り返したくありません。

これを達成することが可能かどうか誰かが知っていますか?

4

7 に答える 7

2

私はこのコードをテストし、結果は非常に良いですこれをテストしてください:

注:フォームとデータグリッドを作成し、次のデータグリッドのプロパティを設定します

1- AutoSizeRowsMo​​de を AllCells に。
2-ターゲット列のWrapModeをTrueに

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

namespace DGMultiLine
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int max = 12; //min Column Width in Char
            //do this for all rows of column for max Line Size in values

            string str = "Hello\r\nI am mojtaba\r\ni like programming very very \r\nrun this code and  pay attention to result\r\n Datagrid Must show this Line Good are you see whole of this Thats Finished!";
            string[] ss = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

            //find max Line Size To Now
            for (int i = 0; i < ss.Length; i++)
                if (ss[i] != null && ss[i] != "")
                    if (ss[i].Length > max)
                        max = ss[i].Length;
            //Set target Column Width
            dataGridView1.Columns[0].Width = max*5;//for adequate value you must refer to screen resolution
            //filling datagrigView for all values
            dataGridView1.Rows[0].Cells[0].Value = str;
        }

    }
}

上記のコードで文字列値を表示する実際の fullText による非表示の列と可視列を追加できますが、最大列サイズのクリップ文字列を超える文字列の行サイズで ... を end に追加します。(明確でない場合は、完全なコードを書くように依頼してください)

于 2013-04-21T18:24:09.960 に答える
1

\r\n を文字列と一緒に実行することでうまくいきました。

たとえば、「こんにちは」+ \r\n です。その後、次の行に進みます。

編集:

これがWinFormsであることがわかりました。上記のトリックは WPF でのみ機能します。

EDIT2:

以下を使用できます。

dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;

長いアイテムをラッピングしたくない場合は、次のようにします。

String stringTest = "1234567891";
if (stringTest.Length > 8)
{
   stringTest = stringTest.Replace(stringTest.Substring(8), "...");
}

文字列が 8 より長い場合は、「...」が追加されます。

于 2013-04-18T00:59:09.617 に答える
0

1 つの方法は、単語の一部を表示するだけで、そのセルの上にマウスを置くとツールチップに全文を表示することができます。

于 2012-12-31T14:02:09.563 に答える
0
       if ((!e.Value.Equals("OK")) && e.ColumnIndex == 6)
        {
            e.CellStyle.WrapMode = DataGridViewTriState.True;
            //dgvObjetivos.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
            dgvObjetivos.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
        }

http://kshitijsharma.net/2010/08/23/showing-multiline-string-in-a-datagridview-cell/

于 2013-09-25T02:02:38.520 に答える
0

このクラスはDataGridViewインスタンスを取得し、幅と高さについても複数行の省略記号 (...) をトリミングするための動作を追加します。

使用法:

MultilineTriming.Init(ref dataGridView); // that's it!

楽しみ、

public static class MultilineTriming
{
    private static int _rowMargins;

    public static void Init(ref DataGridView dataGridView)
    {
        dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
        dataGridView.DefaultCellStyle.WrapMode = DataGridViewTriState.False;

        _rowMargins = dataGridView.RowTemplate.Height - dataGridView.Font.Height;

        Unregister(dataGridView);

        dataGridView.CellEndEdit += DataGridViewOnCellEndEdit;
        dataGridView.CellPainting += DataGridViewOnCellPainting;
        dataGridView.RowsAdded += DataGridViewOnRowsAdded;
        dataGridView.Disposed += DataGridViewOnDisposed;
    }

    private static void DataGridViewOnRowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
    {
        DataGridView view = sender as DataGridView;
        DataGridViewRow row = view.Rows[e.RowIndex];
        foreach (DataGridViewCell cell in row.Cells)
        {
            if (cell.FormattedValue == null)
            {
                continue;
            }
            Size size = TextRenderer.MeasureText((string)cell.FormattedValue, view.Font);
            row.Height = Math.Max(size.Height + _rowMargins, row.Height);
        }
    }

    private static void DataGridViewOnDisposed(object sender, EventArgs eventArgs)
    {
        DataGridView dataGridView = sender as DataGridView;
        Unregister(dataGridView);

    }

    public static void Unregister(DataGridView dataGridView)
    {
        dataGridView.RowsAdded -= DataGridViewOnRowsAdded;
        dataGridView.CellEndEdit -= DataGridViewOnCellEndEdit;
        dataGridView.CellPainting -= DataGridViewOnCellPainting;
    }

    private static void DataGridViewOnCellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        DataGridView view = sender as DataGridView;
        DataGridViewRow row = view.Rows[e.RowIndex];
        DataGridViewCell cell = row.Cells[e.ColumnIndex];

        string text = (string)cell.FormattedValue;

        if (string.IsNullOrEmpty(text)) return;

        Size size = TextRenderer.MeasureText(text, view.Font);
        row.Height = Math.Max(size.Height + _rowMargins, row.Height);
    }

    private static void DataGridViewOnCellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        if (e.ColumnIndex == -1 || e.RowIndex == -1 || e.FormattedValue == null)
        {
            return;
        }
        e.Paint(e.ClipBounds, DataGridViewPaintParts.All ^ DataGridViewPaintParts.ContentForeground);

        DataGridView view = sender as DataGridView;

        string textToDisplay = TrimTextToFit(string.Format("{0}", e.FormattedValue), (int)(e.CellBounds.Width * 0.96) - 3, e.CellBounds.Height - _rowMargins, view.Font);

        bool selected = view.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected;
        SolidBrush brush = new SolidBrush(selected ? e.CellStyle.SelectionForeColor : e.CellStyle.ForeColor);

        e.Graphics.DrawString(textToDisplay, view.Font, brush, e.CellBounds.X + 1, e.CellBounds.Y + _rowMargins / 2);

        e.Handled = true;
    }

    private static string TrimTextToFit(string text, int contentWidth, int contentHeight, Font font)
    {
        Size size = TextRenderer.MeasureText(text, font);

        if (size.Width < contentWidth && size.Height < contentHeight)
        {
            return text;
        }

        int i = 0;
        StringBuilder sb = new StringBuilder();
        while (i < text.Length)
        {
            sb.Append(text[i++]);
            size = TextRenderer.MeasureText(sb.ToString(), font);

            if (size.Width < contentWidth) continue;

            sb.Append("...");

            while (sb.Length > 3 && size.Width >= contentWidth)
            {
                sb.Remove(sb.Length - 4, 1);
                size = TextRenderer.MeasureText(sb.ToString(), font);
            }

            while (i < text.Length && text[i] != Environment.NewLine[0])
            {
                i++;
            }
        }
        string res = sb.ToString();

        if (size.Height <= contentHeight)
        {
            return res;
        }

        string[] lines = res.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
        i = lines.Length;
        while (i > 1 && size.Height > contentHeight)
        {
            res = string.Join(Environment.NewLine, lines, 0, --i);
            size = TextRenderer.MeasureText(res, font);
        }

        return res;
    }
}
于 2013-04-25T08:08:48.323 に答える