WrapMode
のをtrueに設定できることはわかっていますDefaultCellStyle
がRowTemplate
、これでは希望する動作が得られません。各セル内の文字列のリストを表示しているので、キャリッジリターンを認識したいのですが、長いアイテムのテキストを折り返したくありません。
これを達成することが可能かどうか誰かが知っていますか?
WrapMode
のをtrueに設定できることはわかっていますDefaultCellStyle
がRowTemplate
、これでは希望する動作が得られません。各セル内の文字列のリストを表示しているので、キャリッジリターンを認識したいのですが、長いアイテムのテキストを折り返したくありません。
これを達成することが可能かどうか誰かが知っていますか?
私はこのコードをテストし、結果は非常に良いですこれをテストしてください:
注:フォームとデータグリッドを作成し、次のデータグリッドのプロパティを設定します
1- AutoSizeRowsMode を 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 に追加します。(明確でない場合は、完全なコードを書くように依頼してください)
\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 より長い場合は、「...」が追加されます。
1 つの方法は、単語の一部を表示するだけで、そのセルの上にマウスを置くとツールチップに全文を表示することができます。
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/
このクラスは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;
}
}