自定义字符串格式

时间:2012-09-03 14:39:22

标签: c# gridview devexpress

我需要将boolean格式化为多语言支持“Ja”/“Nein”的字符串。 Witch是DisplayFormat和EditFormat所需的正确格式字符串吗? 我在设计中使用DevExpress和repositoryItemTextEdit作为列编辑器,但我认为与任何其他绑定字符串格式相同。还有另一种方法吗?

3 个答案:

答案 0 :(得分:4)

你绝对应该将文字值“Ja”/“Nein”提取到本地化资源中。 Laoujin 做出了很好的回应,但我将通过示例对其进行一些扩展。

首先,定义自定义格式提供程序,它将使用某种类型的本地化

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;

答案 1 :(得分:3)

布尔值无法自动转换为当前语言环境。您可以使用扩展方法来翻译它们:

public static string ToPrettyString(this bool value) {
    return value ? YourResource.TrueValue : YourResource.FalseValue;
}

如果您需要更多灵活性,请查看答案Boolean Format String - Yes/No instead of True/False,其中还有一个实施IFormatProvider的示例。

答案 2 :(得分:1)

最简单的方法是为格式化的值使用不同的属性或列。 您还可以使用数据绑定的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;
}