【问题标题】:Custom String Format自定义字符串格式
【发布时间】:2012-08-28 07:31:32
【问题描述】:

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

【问题讨论】:

    标签: c# gridview devexpress


    【解决方案1】:

    您绝对应该将文字值“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;
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多