是否可以在DevExpress GridView中将货币符号与左侧对齐以及右侧的值对齐?
答案 0 :(得分:1)
此任务超出了常规文本格式。要完成它,您需要手动绘制单元格内容。
XtraGrid为此目的提供了事件:CustomDrawCell。 event argument object提供了对图形对象,单元格边界以及手动绘制单元格文本所需的其他信息的引用。
private void OnGridViewCustomDrawCell(object sender, RowCellCustomDrawEventArgs e) {
switch (e.Column.FieldName) {
case "Debit":
DrawDebitCell(e);
break;
}
}
private void DrawDebitCell(RowCellCustomDrawEventArgs e) {
e.Handled = true;
string text = string.Format(CultureInfo.CurrentCulture, "{0} {1:n2}", CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol, e.CellValue);
Size textSize = e.Appearance.CalcTextSizeInt(e.Cache, text, int.MaxValue);
e.Appearance.DrawBackground(e.Cache, e.Bounds);
if (Convert.ToInt32(textSize.Width) > e.Bounds.Width)
e.Appearance.DrawString(e.Cache, text, e.Bounds);
else {
StringFormat stringFormat = e.Appearance.GetStringFormat();
string valueText = string.Format(CultureInfo.CurrentCulture, "{0:n2}", e.CellValue);
stringFormat.Alignment = StringAlignment.Near;
e.Appearance.DrawString(e.Cache, CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol, e.Bounds, e.Appearance.Font, stringFormat);
stringFormat.Alignment = StringAlignment.Far;
e.Appearance.DrawString(e.Cache, valueText, e.Bounds, e.Appearance.Font, stringFormat);
}
}
这种方法有一些缺点:
有必要计算文本宽度以确保值和货币符号不会相互重叠。为此,您可以使用通过事件参数提供的 AppearanceObject 对象的CalcTextSizeInt方法。 DevExpress使用自己的文本呈现引擎,因此标准Graphics.MeasureString方法在这种情况下无用