【发布时间】:2012-08-28 07:31:32
【问题描述】:
我需要将布尔值格式化为字符串以支持多语言“Ja”/“Nein”。 DisplayFormat 和 EditFormat 需要的正确格式字符串是什么? 我在设计中使用 DevExpress 和 repositoryItemTextEdit 作为列编辑器,但我认为它与任何其他绑定字符串格式相同。还有其他方法吗?
【问题讨论】:
标签: c# gridview devexpress
我需要将布尔值格式化为字符串以支持多语言“Ja”/“Nein”。 DisplayFormat 和 EditFormat 需要的正确格式字符串是什么? 我在设计中使用 DevExpress 和 repositoryItemTextEdit 作为列编辑器,但我认为它与任何其他绑定字符串格式相同。还有其他方法吗?
【问题讨论】:
标签: c# gridview devexpress
您绝对应该将文字值“Ja”/“Nein”提取到本地化资源中。 老金反应很好,我会用例子稍微扩展一下。
首先,定义自定义格式提供程序,它将以某种方式使用本地化
public class LocalizedBoolFormatter : IFormatProvider, ICustomFormatter
{
public string Format(string format, object arg, IFormatProvider formatProvider)
{
bool value = (bool)arg;
format = (format == null ? null : format.Trim().ToLower());
switch (format)
{
case "yn":
return GetLocalizedBool(value);
default:
return HandleDefaultFormat(arg, format, formatProvider);
}
}
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
else
return null;
}
}
LocalizedBoolFormatter 的私有方法可能如下所示:
private string HandleDefaultFormat(object value, string format, IFormatProvider formatProvider)
{
if (value is IFormattable)
return ((IFormattable)value).ToString(format, formatProvider);
else
return value.ToString();
}
private string GetLocalizedBool(bool value)
{
//extract from localization resources
//or use CultureInfo.CurrentCulture for poors man localization
return value ? "Ja" : "Nein";
}
然后您可以使用自定义格式化程序简单地格式化值,该格式化程序将由格式化程序本地化
bool f = false;
string formatted = string.Format(new LocalizedBoolFormatter(), "{0:yn}", f);
Console.WriteLine (formatted);
使用 DevExpress RepositoryItemTextEdit,您可以使用 Custom Formatting,如下所示:
repositoryItemTextEdit.DisplayFormat.Format = new LocalizedBoolFormatter();
repositoryItemTextEdit.DisplayFormat.FormatType = FormatType.Custom;
【讨论】:
布尔值无法自动转换为当前语言环境。您可以使用扩展方法来翻译它们:
public static string ToPrettyString(this bool value) {
return value ? YourResource.TrueValue : YourResource.FalseValue;
}
如果您需要更大的灵活性,请查看答案Boolean Format String - Yes/No instead of True/False,其中还有一个实现IFormatProvider 的示例。
【讨论】:
最简单的方法是为格式化值使用不同的属性或列。 您还可以使用数据绑定的 Parse/Format 事件:
repositoryItemTextEdit1.DataBindings[0].Format += new ConvertEventHandler(repositoryItemTextEdit1_Format);
repositoryItemTextEdit1.DataBindings[0].Parse += new ConvertEventHandler(repositoryItemTextEdit1_Parse);
void repositoryItemTextEdit1_Format(object sender, ConvertEventArgs e)
{
return e.Value ? "Ja" : "Nein";
}
void repositoryItemTextEdit1_Parse(object sender, ConvertEventArgs e)
{
return e.Value.Equals("Ja") ? yes : no;
}
【讨论】: