C#学习教程:C#DataGridView:当列右对齐时,长文本在左侧被截断为“...”我有一个关于单元格截断(用“...”替换)的问题:当列右对齐时替换单元格左侧的“...”?我使用非等宽字体,所以我不能只计算字符数来进行一些字符串操作作为解决方法,我需要一个解决方案。我相信应该有。为了说明我的问题,我在此处模拟我的DataGridView中心词|右上下文(左对齐列)左上下文未被截断|中心词|右上下文未被截断...这是被截断的长左上下文|中心词|这是被截断的长右上下文......我想我已经说清楚了。谢谢。请帮我。彼得PS:同样的问题可以在这个链接中找到:http://objectmix.com/csharp/341736-datagridview-cell-format-question.html这绝对是一件不寻常的事情-但是(像其他一切一样)它可以完成.这是一个测量字符串大小并将其与单元格大小进行比较的问题。(请注意,我假设数据是由用户输入的。如果您进行数据绑定,则基本上必须使用其他事件。)这可行,但可能需要一些微调:publicpartialclassForm1:Form{publicForm1(){InitializeComponent();dataGridView1.Columns.Add("col1","col1");dataGridView1.Columns[0].CellTemplate.Style.Alignment=DataGridViewContentAlignment.MiddleRight;dataGridView1.Columns.Add("col2","col2");dataGridView1.Columns.Add("col3","col3");dataGridView1.Rows.Add();dataGridView1.CellEndEdit+=newDataGridViewCellEventHandler(dataGridView1_CellEndEdit);dataGridView1.ColumnWidthChanged+=newDataGridViewColumnEventHandler(dataGridView1_ColumnWidthChanged);}voiddataGridView1_ColumnWidthChanged(objectsender,DataGridViewColumnEventArgse){if(e.Column.Index==0){//当宽度改变时我们需要再次截断所有内容foreach(DataGridViewRowrowindataGridView1.Rows){RightTruncateText(row.Cells[0]);}}}voidRightTruncateText(DataGridViewCellcell){//检查内容是否太长:使用(Graphicsg=Graphics.FromHwnd(this.Handle)){SizeFsize=g.MeasureString((string)cell.Tag,dataGridView1.Font);//注意:使用标签if(size.Width>cell.Size.Width){StringBuildertruncated=newStringBuilder((string)cell.Tag);截断。插入(0,“...”);//截断字符串直到足够小(注意:没有以任何方式优化!)while(size.Width>cell.Size.Width){truncated.Remove(3,1);size=g.MeasureString(truncated.ToString(),dataGridView1.Font);}cell.Value=truncated.ToString();}else{cell.Value=cell.Tag;}}}voiddataGridView1_CellEndEdit(objectsender,DataGridViewCellEventArgse){if(e.ColumnIndex==0){//保存标签中的值但显示截断的值DataGridViewCellcell=dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];单元格.Tag=单元格.Value;//保存实际状态RightTruncateText(cell);我最终通过创建自己的DataGridViewLeftCropTextBoxCell来做到这一点不幸的是,DataGridViewTextBoxCell::Paint是一个复杂的方法ReferenceSource.NETFramework4.5.2,它使用许多.NET内部方法。但首先我让基类绘制背景和边框(如果没有前景可感知,就留下它)。然后测量文本并缩小它直到它适合值边界。使用系统;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.Windows.Forms;使用系统绘图;namespaceProject{publicclassDataGridViewLeftCropTextBoxCell:DataGridViewTextBoxCell{//////绘制内容////////////////////////////////////protectedoverridevoidPaint(Graphicsgraphics,RectangleclipBounds,RectanglecellBounds,introwIndex,DataGridViewElementStatescellState,objectvalue,objectformattedValue,stringerrorText,DataGridViewCellStylecellStyle,DataGridViewAdvancedBorderStyleadvancedBorderStyle,DataGridViewPaintPartspaintParts){stringformattedString=formattedValueasstring;}//什么都不画返回;}//在没有前景的情况下以父方式绘制base.Paint(图形、clipBounds、cellBounds、rowIndex、cellState、value、formattedValue、errorText、cellStyle、advancedBorderStyle、paintParts&~DataGridViewPaintParts.ContentForeground);//没有前景?如果((paintParts&DataGridViewPaintParts.ContentForeground)==DataGridViewPaintParts.None){返回;}//计算值范围RectangleborderWidths=BorderWidths(advancedBorderStyle);矩形valBounds=cellBounds;valBounds.Offset(borderWidths.X,borderWidths.Y);valBounds.Width-=borderWidths.Right;valBounds.Height-=borderWidths.Bottom;boolcellSelected=(cellState&DataGridViewElementStates.Selected)!=0;//准备文本标志TextFormatFlagsflags=ComputeTextFormatFlagsForCellStyleAlignment(this.DataGridView.RightToLeft==RightToLeft.Yes,cellStyle.Alignment,cellStyle.WrapMode);if((flags&TextFormatFlags.SingleLine)!=0){flags|=TextFormatFlags.EndEllipsis;}//准备文本大小Sizes=TextRenderer.MeasureText(图形、格式化字符串、cellStyle.Font);//文本适合边界,只需追加if(s.WidthvalBounds.Width)&&(truncated.Length>5)){truncated.Remove(3,1);formattedString=truncated.ToString();s=TextRenderer.MeasureText(图形、格式化字符串、cellStyle.Font);}TextRenderer.DrawText(图形,格式化字符串,cellStyle.Font,valBounds,cellSelected?cellStyle.SelectionForeColor:cellStyle.ForeColor,标志);}}}你也可以创建你自己的列类型:}set{base.CellTemplate=value;我从.NETFrameworksteinar'sanswerfromReferenceSource和TextFormatFlagsComputeTextFormatFlagsForCellStyleAlignmentText借来的我做了一个解决方法,它工作除了“...”(截断工作正常)if(e.RowIndex>=0&&e.ColumnIndex>=0&&CustomRightToLeftColumnNames.Contains(this.Columns[e.ColumnIndex].Name)){//方法2:e.PaintBackground(e.CellBounds,true);if(e.FormattedValue!=null){TextFormatFlags标志=TextFormatFlags。从右到左|TextFormatFlags.VerticalCenter|TextFormatFlags.右|TextFormatFlags.LeftAndRightPadding;//|//TextFormatFlags.EndEllipsis;TextRenderer.DrawText(e.Graphics,e.FormattedValue.ToString(),e.CellStyle.Font,e.CellBounds,.CellStyle.ForeColor,flags);}e.Handled=true;这个解决方案的唯一问题是我不知道如何设置TextFormatFlags以获得我想要的正确行为,与DataGridView.RightToLeft=Yes时完全相同。如果我打开TextFormatFlags.EndEllipsis,三个点“...”会出现在左侧,但它会从字符串的右端截断。我不确定要打开哪个TextFormatFlags枚举标志。以上是C#学习教程:C#DataGridView:列右对齐时,长文本用左边“...”截断,共享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
