【问题标题】:Copy subset of items from one RadComboBox to another将项目的子集从一个 RadComboBox 复制到另一个
【发布时间】:2011-08-27 00:30:40
【问题描述】:

我正在尝试将 RadComboBoxItems 的一个子集从一个 RadComboBox复制到另一个。目前,我正在尝试使用可枚举的 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() 方法的结果放入一个列表中,希望如果我不直接从 Items 集合中工作,ddlStartDayOfWeek 不会受到影响,但这也不起作用。

如果可能的话,我想找到一个与我现在正在做的类似的解决方案。我真的很感激能帮我解决这个问题。

【问题讨论】:

    标签: c# asp.net linq telerik webforms


    【解决方案1】:

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

    【讨论】:

    • 我一直在摆弄这个想法,但我不知道如何在 LINQ 中做到这一点。有什么想法吗?
    • 您是否尝试过类似 dlEndDayOfWeek.Items.AddRange(ddlStartDayOfWeek.Items.Where(listItem => listItem.Index > ddlStartDayOfWeek.SelectedIndex).Select (x => new {x.Value, x.文本 }));?我这里没有 Telerik 控件,所以我无法测试,但你明白了 - 只需创建新的 ListItems。
    • 问题在于 - ddlStartDayOfWeek.Items.Where(listItem => listItem.Index > ddlStartDayOfWeek.SelectedIndex) - 从 ddlStartDayOfWeek 中删除过滤的项目。我会试一试,只是说我做到了。我知道我可以使用 foreach 将新列表项添加到 ddlEndDayOfWeek,但我想知道如何使用 LINQ。
    【解决方案2】:

    我希望使用 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;
    } 
    

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

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多