Копировать подмножество элементов из одного RadComboBox в другой - PullRequest
1 голос
/ 27 августа 2011

Я пытаюсь скопировать подмножество RadComboBoxItems из одного RadComboBox в другой.В настоящее время я пытаюсь сделать это, используя перечислимый метод Where ().Хотя элементы копируются в список адресатов, элементы также удаляются из списка источников.

РЕДАКТИРОВАТЬ: Просто для пояснения, я знаю, что есть другие способы сделать это, но мне было интересно, как это сделать с помощью методов Enumerable LINQ.Кажется, что это должно быть возможно, и я видел примеры копирования элементов списка в другой список.

EDIT : Хорошо, этот код работает, как и ожидалось:

List<RadComboBoxItem> itemList = new List<RadComboBoxItem>( new RadComboBoxItem[] { new RadComboBoxItem("Mon", "0"), new RadComboBoxItem("Tue", "1"), new RadComboBoxItem("Wed", "2") });

//result = 1 (original list queried using where method
int filteredCount = itemList.Where(item => Int32.Parse(item.Value) > 1).Count(); 

//result = 3 (original list preserved)
int itemListCount = itemList.Count; 

Но этот код не работает.Он добавляет элементы в ddlEndDayOfWeek, но также удаляет отфильтрованные элементы из ddlStartDayOfWeek:

ddlEndDayOfWeek.Items.AddRange(ddlStartDayOfWeek.Items.ToList().Where(item => item.Index > ddlStartDayOfWeek.SelectedIndex));

Что я здесь не так делаю?

Вот список источников:

<telerik:RadComboBox ID="ddlStartDayOfWeek" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlStartDayOfWeek_SelectedIndexChanged">
    <Items>
        <telerik:RadComboBoxItem Text="Sunday" Value="0" />
        <telerik:RadComboBoxItem Text="Monday" Value="1" />
        <telerik:RadComboBoxItem Text="Tuesday" Value="2" />
        <telerik:RadComboBoxItem Text="Wednesday" Value="3" />
        <telerik:RadComboBoxItem Text="Thursday" Value="4" />
        <telerik:RadComboBoxItem Text="Friday" Value="5" />
        <telerik:RadComboBoxItem Text="Saturday" Value="6" />
    </Items>
</telerik:RadComboBox>

Вот список адресатов:

<telerik:RadComboBox ID="ddlEndDayOfWeek" runat="server" Skin="Sunset" Font-Size="12px" Font-Names="Verdana" Width="150" OnSelectedIndexChanged="ddlEndDayOfWeek_SelectedIndexChanged"></telerik:RadComboBox>

ddlEndDayOfWeek не будет отображаться, пока пользователь не нажмет кнопку «Добавить диапазон», и в этот момент будет отображен ddlEndDayOfWeek, в который будет добавлен список дней, выпадающих послевыбранный день от ddlStartDayOfWeek.Если пользователь выбирает другой день из ddlStartDayOfWeek, ddlEndDayOfWeek будет снова отфильтрован.Например, если для ddlStartDayOfWeek выбран четверг, в ddlEndDayOfWeek будут отображаться только пятница и суббота.По сути, пользователь должен выбрать диапазон дней, и конечный диапазон не может быть меньше начального диапазона.

Я бы хотел, чтобы это работало так, как я планировал.Вот код, который я использую для заполнения ddlEndDayOfWeek:

protected void PrepareRangeSpecifier()
{
    //clear the selection and items from the end range list
    if (ddlEndDayOfWeek.Items.Count > 0)
    {
        ddlEndDayOfWeek.ClearSelection();
        ddlEndDayOfWeek.Items.Clear();
    }

    //if the user has chosen to enter a range
    if(plcEndRange.Visible)
    {
        //populate the end range with days falling after the start range
        ddlEndDayOfWeek.Items.AddRange(ddlStartDayOfWeek.Items.Where(listItem => listItem.Index > ddlStartDayOfWeek.SelectedIndex));

        //if the end range contains items select the first one
        if (ddlEndDayOfWeek.Items.Count > 0)
            ddlEndDayOfWeek.Items.FirstOrDefault().Selected = true; 
    }
}

Это прекрасно работает, за исключением того факта, что когда я добавляю элементы в ddlEndDayOfWeek, они удаляются из ddlStartDayOfWeek.Что я делаю не так, и как мне это исправить?Так должен работать метод Where ()?Я попытался поместить результаты метода Where () в List, надеясь, что, если бы я не работал напрямую с коллекцией Items, на ddlStartDayOfWeek это не повлияло, но это тоже не сработало.

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

Ответы [ 2 ]

0 голосов
/ 30 сентября 2011

Я надеялся достичь этого с помощью методов Enumerable LINQ, но в конце концов я просто решил сделать это старым и проверенным способом:

/// <summary>
/// Prepares the range specifier.
/// </summary>
private void PrepareRangeSpecifier()
{                  
    //clear the items from the end range list
    ddlEndDayOfWeek.Items.Clear();

    if (pnlEndDayOfWeek.Visible)
    {
        foreach (RadComboBoxItem item in ddlStartDayOfWeek.Items)
        {
            //insert the list items from the start range list
            if (item.Index > ddlStartDayOfWeek.SelectedIndex)
                ddlEndDayOfWeek.Items.Add(new RadComboBoxItem(item.Text, item.Value));
        }

        //set end range panel visibility
        pnlEndDayOfWeek.Visible = ddlEndDayOfWeek.Items.Count > 0;
    }

    //if the end range has any items
    if (ddlEndDayOfWeek.Items.Count > 0)
        ddlEndDayOfWeek.Items.FirstOrDefault().Selected = true;
} 

Я ценю вклад других,и новые ответы все еще приветствуются!

0 голосов
/ 27 августа 2011

Не пробовал, но, похоже, это происходит потому, что вы добавляете объекты RadComboBoxItem , которые уже существуют на странице , в другой RadComboBox. Вам просто нужно скопировать значения и тексты выбранной коллекции RadComboBoxItem в новые RadComboBoxItems вместо того, чтобы (вероятно) перемещать сами объекты из одного RadComboBox в другой.

...