C# DataGridView单元格中的多行文本

C# DataGridView单元格中的多行文本,c#,winforms,datagridview,C#,Winforms,Datagridview,我试图在DataGridView单元格中以多行显示文本。我不想使用换行模式,因为文本不是很长。我只想在第一行显示第一个单词,在下一行显示第二个单词,就像这样。请注意第二行的粗体文本 名称:abc 城市:xyz 我尝试使用Environment.NewLine和“\r\n”进行此操作,但两者都不起作用 private void dgv_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) {

我试图在DataGridView单元格中以多行显示文本。我不想使用换行模式,因为文本不是很长。我只想在第一行显示第一个单词,在下一行显示第二个单词,就像这样。请注意第二行的粗体文本


名称: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”连接所有单词,并将整个字符串设置为同一单元格。你能发布你的解决方案吗?你的解决方案在哪里?你能回答你答案的上下文吗?这样其他用户就可以理解你的答案,而无需深入研究?