将项目的子集从一个RadComboBox复制到另一个

时间:2011-08-27 00:30:41

标签: c# asp.net linq telerik webforms

我正在尝试从一个RadComboBox 复制 RadComboBoxItems的一个子集到另一个。目前,我正在尝试使用可枚举的Where()方法。虽然这些项目正在复制到目标列表,但这些项目也将从源列表中删除。

修改 只是为了澄清,我知道还有其他方法可以实现这一点,但我想知道如何使用Enumerable LINQ方法做到这一点。看起来它应该是可能的,我已经看到了将列表项复制到另一个列表的示例。

编辑:好的,所以此代码按预期工作:

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 :(得分:0)

没试过,但似乎发生这种情况是因为您正在将已存在于页面上的RadComboBoxItem对象添加到另一个RadComboBox。您应该只将所选RadComboBoxItem集合的值和文本复制到新的RadComboBoxItems中,而不是(可能)将对象本身从一个RadComboBox移动到另一个RadComboBox。

答案 1 :(得分:0)

我希望通过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;
} 

我非常感谢其他人的贡献,并且仍然欢迎新的答案!