代码之家  ›  专栏  ›  技术社区  ›  Manu A N

在ASP.NET中本地化动态绑定DropDownList

  •  2
  • Manu A N  · 技术社区  · 9 年前

    我有一个与数据库表绑定的下拉列表' 国家 '
    下拉列表采用列 国家名称 作为其数据文本字段和 国家代码 作为数据值字段。
    假设此表有3个条目,它们分别具有如下所示的列值。

    印度 ,
    德国 , 判定元件
    美国 , 美国

    我正在改变文化 去de
    我知道对单个静态文本使用resx文件。 现在,我如何将多个datatextfield项本地化到 去de 同时

    1 回复  |  直到 9 年前
        1
  •  2
  •   RePierre    9 年前

    要做到这一点,您需要将表行集合与资源文件中的值连接在一起,然后将数据打包到一个自定义类型中 DropDownList 。因此:

    var tableRows = table.Rows.Cast<DataRow>();
    var resourceStrings = YourResourceClass.ResourceManager
            .GetResourceSet(culture: CultureInfo.CurrentUICulture,
                createIfNotExists: false,
                tryParents: true)
            .Cast<DictionaryEntry>();
    
    var data = tableRows
            .Join(resourceStrings,
                row => row["countrycode"].ToString(),
                resource => resource.Key,
                (row, resource) => new KeyValuePair<string, string>(
                    row["countrycode"].ToString(),
                    resource.Value.ToString()))
            .ToArray();
    

    现在,更改 下拉框 至:

    ddl.DataTextField = "Value";
    ddl.DataValueField = "Key";
    

    并绑定数据源:

    ddl.DataSource = data;
    

    编辑

    为了在不使用LINQ的情况下实现相同的结果,您需要将资源加载到字典中,然后遍历countries表以构建数据源;类似于:

    var resources = new Dictionary<string,string>();
    var resourceSet = YourResourceClass.ResourceManager.GetResourceSet(
        CultureInfo.CurrentUICulture, false, true);
    foreach(DictionaryEntry kvp in resourceSet)
    {
        resources[kvp.Key] = kvp.Value.ToString();
    }
    
    var dataSource = new List<KeyValuePair<string, string>>();
    foreach(DataRow in table.Rows)
    {
        var countryCode = row["countrycode"].ToString();
        if(resources.ContainsKey(countryCode))
        {
            dataSource.Add(new KeyValuePair<string, string>(
                countryCode,
                resources[contryCode]));
        }
    }
    

    接下来,绑定 dataSource 到你的DropDownList,你就准备好了!