четверг, 20 марта 2014 г.

Языконезависимая фильтрация полей типа choise в коде

Если вы хотя бы иногда сталкивались в полями "выбор" при разработке для Sharepoint, вы знаете, что они представляют собой банальный массив строк, которые меняются в зависимости от используемого языка. И если вам нужно, чтобы ваше решение работало одинаково, не зависимо от языка установки то приходится использовать всякие нетривиальные решения. Вот так я, например, сделал фильтрацию по статусам задач из списков типа "Задачи".  Выглядит это вот так:


И, by design, должно фильтровать список задач по соответствующим статусам. Проблема в том, что при англоязычной установке статус называется "Not Started", а на русскоязычной "Не начата". И более того, все эти статусы можно банально поменять или добавить новые, которые тоже должны работать как ожидается.


После некоторых раздумий, я пришел к вот такому варианту кода, как базово работоспособному:
        
        protected void Page_Load(object sender, EventArgs e)
        {           
            if (!Page.IsPostBack)
            {
                //В первою очередь находим интересующее нас choise поле
                SPFieldChoice field = (SPFieldChoice)SPContext.Current.Web.Fields["Task Status"];
                TaskTypeSelect.Items.Clear();
                TaskTypeSelect.Items.Add(new ListItem("Все", "0"));
                for (int i=0;i < field.Choices.Count;i++)
                {
                    TaskTypeSelect.Items.Add(new ListItem(field.Choices[i], field.Choices[i]));
                }     
            }
        }

В принципе, можно было бы получать не глобальное поле, а поле статусов каждого из списков, примерно таким образом:
        SPFieldChoice field = (SPFieldChoice)SPContext.Current.Web.Lists["название_списка"].Fields["Status"];

а потом добавлять в дропдаун все уникальные варианты. Но это, имхо, идеологически неправильно - позволять пользователям делать в разных списках поле одного и того же типа с разными возможными значениями. Так что, был согласован вариант, что если что-то и будет добавляться, то будет добавляться глобально.
Код же для фильтрации элементов прост до безобразия:
                    
                foreach (SPListItem itm in list.Items)
                {                                                            
                    if (TaskTypeSelect.SelectedValue != "0")
                    {            
                        if (itm["Status"].ToString() != TaskTypeSelect.SelectedValue) continue;
                    }
                    //Дальше добавляет этот элемент в список отображаемых.
                }


Комментариев нет:

Отправить комментарий