Infragistics Ultragrid valueList/UltraDropDown

Какое событие мне нужно обработать, чтобы пользователи могли добавлять «фрукты» либо в список значений, либо в раскрывающийся список «Ультра».

Поскольку это KVP, я всегда получаю исключение формата

Dictionary<int,string> fruits = new Dictionary<int,string>();



 private void FruitInit()
     {
    //Create some fruit        
    fruits.Add(-1,"apple");
            fruits.Add(-2,"banana");

            //Create and add to the ultraDropDown
            UltraDropDown fruitUltraDropDown = new UltraDropDown();
            fruitUltraDropDown.DataSource = fruits.ToList();
            fruitUltraDropDown.DisplayMember = "Value";
            fruitUltraDropDown.ValueMember = "Key";
            MyUltraGrid.DisplayLayout.Bands[0].Columns["MyColumn"].ValueList = fruitUltraDropDown;
        }

Какое событие я могу обработать, чтобы, когда пользователь вводит «виноград», я мог добавить его в словарь с помощью своего собственного ключа, и оно было добавлено в раскрывающийся список. В настоящее время, если я набираю «виноград» в ячейке, я просто получаю исключение формата.

С Уважением

_Эрик


person Eric    schedule 21.12.2010    source источник
comment
Очень запутанный вопрос; UltraWinGrid и UltraDropDown — несвязанные элементы управления. О какой ячейке ты говоришь? Добавить что-либо в Dictionary будет невозможно, потому что вы выбрасываете это после создания ValueList. Кроме того, опубликуйте ошибку, которую вы получаете.   -  person Dour High Arch    schedule 22.12.2010
comment
@Dour Спасибо, я не уверен, что смущает. Я добавил ultraDropDown в MyColumn в своей ультрасетке. Это работает нормально, пользователи могут выбрать яблоко || банан. Пользователи должны иметь возможность вводить собственное значение, то есть виноград, но когда они это делают, я получаю исключение формата, в котором говорится, что он не может преобразовать его в int.32, что ожидается, поскольку его valueMember является int. Я ищу событие для обработки, чтобы я мог добавить его обратно в словарь и повторно привязать список. Обычно с источниками привязки я обрабатывал бы AddNew и добавлял свой собственный индекс вместе с определяемым пользователем текстом (-3, виноград) в этом примере.   -  person Eric    schedule 22.12.2010


Ответы (3)


Получил ответ от Mike@infragistics, я не знал о ValueListResolved

Ответ от Майка

Есть ряд событий, которые вы могли бы использовать. Я бы, вероятно, использовал BeforeCellUpdate или, может быть, BeforeExitEditMode.

В любом случае вы должны использовать свойство ValueListResolved в ячейке, чтобы получить ValueList, а затем вы можете использовать метод GetValue, чтобы попытаться найти соответствующий элемент в списке. Используйте cell.EditorResolved.Text, чтобы получить текущий текст редактирования в ячейке для вашего поиска.

person Eric    schedule 22.12.2010

Если вы используете «UltraDropDown» для списка значений, вы можете обработать его событие «BeforeDropDown». Сравните «используемые» значения в сетке со значениями в UltraDropDown, а затем скройте те, которые используются. Работал на меня.

    private void BindApprovalsTab()
    {
        uddApproverList.BeforeDropDown -= new CancelEventHandler(uddApproverList_BeforeDropDown);
        uddApproverList.DataSource = dsFindingDetails.Tables["Approvers"];
        uddApproverList.DisplayMember = "fldDisplayName";
        uddApproverList.ValueMember = "fldRoleGID";
        uddApproverList.Width = 150;
        uddApproverList.DisplayLayout.Bands[0].Columns["fldRoleGID"].Hidden = true;
        uddApproverList.DisplayLayout.Bands[0].Columns["fldDisplayName"].Header.Caption = "Role";
        uddApproverList.DisplayLayout.Bands[0].Columns["fldDisplayName"].Width = uddApproverList.Width;
        uddApproverList.BeforeDropDown += new CancelEventHandler(uddApproverList_BeforeDropDown);

        ugActionItemApprovals.DataSource = dsFindingDetails.Tables["tblIssueApprovals"];

    }

    void uddApproverList_BeforeDropDown(object sender, CancelEventArgs e)
    {
        //assume all rows show
        foreach (UltraGridRow udr in uddApproverList.Rows)
        {
            udr.Hidden = false;
        }
        //can we remove already used entries?
        foreach (UltraGridRow udr in uddApproverList.Rows)
        {
            string sDDRoleGID = udr.Cells["fldRoleGID"].Value.ToString();
            foreach (UltraGridRow ur in ugActionItemApprovals.Rows)
            {
                if (ur.Cells["fldApprovalRequiredBy"].Value.ToString() == sDDRoleGID)
                {
                    udr.Hidden = true;
                    break;
                }
            }
        }
    }
person J Frisby    schedule 17.05.2012

Это может иметь или не иметь отношение к вашему вопросу, но в вашем коде много странных вещей.

UltraDropDown fruitUltraDropDown = new UltraDropDown();

В состав Infragistics входят мастера для создания, заполнения и отображения элементов управления в файле Designer.cs. Создание такого элемента управления отбрасывает все данные конструктора и создает новый элемент управления по умолчанию. Вы действительно намерены это? Это выдержка из файла Designer.cs?

fruitUltraDropDown.DataSource = fruits.ToList();

Это создает новый List<KeyValuePair<int, string>> из вашего Dictionary. fruits теперь недоступен и подлежит сборке мусора, любые внесенные в него изменения никогда не будут распространяться на fruitUltraDropDown. Почему вы создаете fruits только для того, чтобы выбросить?

What event can I handle so when a user types "grape"...

Типы где? fruitUltraDropDown? Данные дизайнера были выброшены, поэтому fruitUltraDropDown нельзя редактировать, если только вы не показываете много кода. MyUltraGrid? Вы не показываете никакого кода для этого, поэтому никто не может понять, что он реализует. Текстовое поле? Программные данные? Полная загадка.

I can add it to the dictionary...

Добавлять что-либо в Dictionary бессмысленно, потому что вы его больше не используете. Если вы хотите добавить его к ultraDropDown1.DataSource, вам нужно добавить KeyValuePair<int, string>:

var ds = ultraDropDown1.DataSource as List<KeyValuePair<int, string>>;
ds.Add(new KeyValuePair<int,string>(-3, "grape"));

Это просто добавит запись в резервное хранилище. Если вы хотите включить его в ultraDropDown1:

ultraDropDown1.DataBind();

Если это бесполезно, вы должны добавить в свой вопрос достаточно информации, чтобы кто-то, не имеющий исходного кода, мог понять, что вы пытаетесь сделать.

person Dour High Arch    schedule 22.12.2010
comment
это все исходники, я отредактировал код, чтобы показать FruitInit, надеюсь, это сделает его более понятным. AfterCellUpdate было событием, которое мне было нужно, чтобы проверить, была ли запись пользователя в списке, если не добавить ее в словарь, и обновить раскрывающийся список для использования другими строками. - person Eric; 22.12.2010