C# DataGridView单元格中的多行文本
我试图在DataGridView单元格中以多行显示文本。我不想使用换行模式,因为文本不是很长。我只想在第一行显示第一个单词,在下一行显示第二个单词,就像这样。请注意第二行的粗体文本C# DataGridView单元格中的多行文本,c#,winforms,datagridview,C#,Winforms,Datagridview,我试图在DataGridView单元格中以多行显示文本。我不想使用换行模式,因为文本不是很长。我只想在第一行显示第一个单词,在下一行显示第二个单词,就像这样。请注意第二行的粗体文本 名称:abc 城市:xyz 我尝试使用Environment.NewLine和“\r\n”进行此操作,但两者都不起作用 private void dgv_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) {
名称:abc
城市:xyz 我尝试使用Environment.NewLine和“\r\n”进行此操作,但两者都不起作用
private void dgv_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
foreach (DataGridViewRow dgvrow in dgv.Rows)
{
if (dgv.CurrentCell.ColumnIndex == dgv.Columns["Name"].Index)
{
DataGridViewCell dgvcell = (DataGridViewCell)dgvrow.Cells["Name"];
string Name = dgvcell.Value.ToString();
string City = Name.Substring(Name.IndexOf("City:"));
Name = Name.Substring(0, Name.IndexOf("City:")) + Environment.NewLine + City;
dgvcell.Value = Name;
}
}
}
有人能建议如何实现这一目标吗?谢谢。您应该能够通过将
DataGridViewTextBoxColumn
的DefaultCellStyle
的WrapMode
设置为true,并将AutoSizeRowsMode=DataGridViewAutoSizeRowsMode设置为。。
您需要将AutoSizeColumnsMode设置为AllCells
foreach (DataGridViewRow dgvrow in dgv.Rows)
{
if (dgv.CurrentCell.ColumnIndex == dgv.Columns["Name"].Index)
{
DataGridViewCell dgvcell = (DataGridViewCell)dgvrow.Cells["Name"];
string Name = dgvcell.Value.ToString();
string City = Name.Substring(Name.IndexOf("City:"));
Name = Name+"\r\n"+City;
dgvcell.Value = Name;
}
}
它肯定会工作我通过处理DataGridView\u CellFormatting事件并根据需要格式化文本来修复它。谢谢大家的建议。这对我很有用:
dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
我也遇到了类似的困难,因为我想使用换行符,但只是在我指定要用换行符换行的地方。
我的解决方案是根据我不希望包装的最长字符串调整列宽,然后让包装来完成其余的工作
请随意尝试以下内容,或根据您的目的对其进行修改
private void dataGridView_TextItems_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (sender is DataGridView dgv && dgv.Rows[e.RowIndex].Cells[e.ColumnIndex] is DataGridViewTextBoxCell cell)
{
SetDGVTextBoxColumnWidth(dgv.Columns[e.ColumnIndex] as DataGridViewTextBoxColumn);
}
}
private void SetDGVTextBoxColumnWidth(DataGridViewTextBoxColumn column)
{
if (column != null)
{
DataGridView dgv = column.DataGridView;
Graphics g = dgv.CreateGraphics();
Font font = dgv.Font;
// Acquire all the relevant cells - the whole column's collection of cells:
List<DataGridViewTextBoxCell> cells = new List<DataGridViewTextBoxCell>();
foreach (DataGridViewRow row in column.DataGridView.Rows)
{
cells.Add(row.Cells[column.Index] as DataGridViewTextBoxCell);
}
// Now find the widest cell:
int widestCellWidth = g.MeasureString(column.HeaderText, font).ToSize().Width; // Start with the header text, but for some reason this seems a bit short.
bool foundNewline = false;
foreach (DataGridViewTextBoxCell cell in cells)
{
font = ((cell.Style.Font != null) ? cell.Style.Font : dgv.Font); // The font may change between cells.
string cellText = cell.Value.ToString().Replace("\r",""); // Ignore any carriage return characters.
if (cellText.Contains('\n'))
{
foundNewline = true;
cell.Style.WrapMode = DataGridViewTriState.True; // This allows newlines in the cell's text to be recognised.
string[] lines = cellText.Split('\n');
foreach (string line in lines)
{
int textWidth = g.MeasureString(line + "_", font).ToSize().Width; // A simple way to ensure that there is room for this text.
widestCellWidth = Math.Max(widestCellWidth, textWidth);
}
}
else
{
int textWidth = g.MeasureString(cellText + "_", font).ToSize().Width;
widestCellWidth = Math.Max(widestCellWidth, textWidth);
}
}
if (foundNewline)
{
column.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; // Allows us to programatically modify the column width.
column.Width = widestCellWidth; // Simply set the desired width.
}
else
{
column.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; // Allow the system to do the work for us. This does a better job with cell headers.
}
column.Resizable = DataGridViewTriState.False; // We don't wish the User to modify the width of this column manually.
}
}
private void dataGridView\u TextItems\u CellFormatting(对象发送方,DataGridViewCellFormattingEventArgs e)
{
if(发送方为DataGridView dgv&&dgv.Rows[e.RowIndex]。单元格[e.ColumnIndex]为DataGridViewTextBoxCell单元格)
{
设置DGVTextBoxColumnWidth(dgv.Columns[e.ColumnIndex]作为DataGridViewTextBoxColumn);
}
}
私有void SetDGVTextBoxColumnWidth(DataGridViewTextBoxColumn列)
{
if(列!=null)
{
DataGridView dgv=column.DataGridView;
Graphics g=dgv.CreateGraphics();
Font Font=dgv.Font;
//获取所有相关单元格-整个列的单元格集合:
列表单元格=新列表();
foreach(column.DataGridView.Rows中的DataGridViewRow行)
{
cells.Add(row.cells[column.Index]作为DataGridViewTextBoxCell);
}
//现在查找最宽的单元格:
int widetCellWidth=g.MeasureString(column.HeaderText,font).ToSize().Width;//从标题文本开始,但由于某些原因,这似乎有点短。
bool-foundNewline=false;
foreach(单元格中的DataGridViewTextBoxCell单元格)
{
font=((cell.Style.font!=null)?cell.Style.font:dgv.font);//字体可能在单元格之间更改。
字符串cellText=cell.Value.ToString().Replace(“\r”,”);//忽略任何回车字符。
if(cellText.Contains('\n'))
{
foundNewline=true;
cell.Style.WrapMode=DataGridViewTriState.True;//这允许识别单元格文本中的换行符。
string[]line=cellText.Split('\n');
foreach(行中的字符串行)
{
int textWidth=g.MeasureString(line+“,”font).ToSize().Width;//一种确保此文本有空间的简单方法。
WidetCellWidth=Math.Max(WidetCellWidth,textWidth);
}
}
其他的
{
int textWidth=g.MeasureString(cellText+“”,字体).ToSize().Width;
WidetCellWidth=Math.Max(WidetCellWidth,textWidth);
}
}
国际单项体育联合会(纽兰)
{
column.AutoSizeMode=DataGridViewAutoSizeColumnMode.None;//允许我们通过编程修改列宽。
column.Width=widetCellWidth;//只需设置所需的宽度即可。
}
其他的
{
column.AutoSizeMode=DataGridViewAutoSizeColumnMode.AllCells;//允许系统为我们完成这项工作。这可以更好地处理单元格标题。
}
column.Resizable=DataGridViewTriState.False;//我们不希望用户手动修改此列的宽度。
}
}
您是否尝试用分隔词分隔\r\n?@Marton尝试了它,但不起作用。两行上重复的词之间可以有空格。在这种情况下,文本将在空格处而不是换行处换行。我需要一种方法将文本准确地包装在换行符处。它仍然不起作用。根据单词长度,一些行在空格处换行,另一些行在换行。理想情况下,我想要的是,无论单词长度如何,换行之前的所有内容都在一行中。换行后的文本也是如此。谢谢。然后做一件事,在cellvalidating中,获取整个单元格的值,并将它们拆分为单词,形成一个字符串数组。并用“\r\n”连接所有单词,并将整个字符串设置为同一单元格。你能发布你的解决方案吗?你的解决方案在哪里?你能回答你答案的上下文吗?这样其他用户就可以理解你的答案,而无需深入研究?