2011-08-27 84 views
1

我试图复制 RadComboBoxItems从一个RadComboBox的子集到另一个。目前,我正在尝试使用可枚举的Where()方法执行此操作。尽管项目正被复制到目标列表中,但项目也将从源列表中删除。从一个RadComboBox复制项目的子集到另一个

编辑: 只是为了澄清,我知道有其他的方法来做到这一点,但我想知道如何与可枚举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将不会受到影响,但这也不起作用。

如果可能,我想找到一个类似于我现在所做的解决方案。我真的很感谢帮助解决这个问题。

+0

任何人有任何想法? –

回答

0

我希望用可枚举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

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

+0

我已经摆弄这个想法,但我不知道如何在LINQ中做到这一点。有任何想法吗? –

+0

您是否尝试过类似dlEndDayOfWeek.Items.AddRange(ddlStartDayOfWeek.Items.Where(listItem => listItem.Index> ddlStartDayOfWeek.SelectedIndex).Select(x => new {x.Value,x.Text}));?我在这里没有Telerik控件,所以我无法测试,但你明白了 - 只需创建新的ListItems。 – Olaf

+0

问题是 - ddlStartDayOfWeek.Items.Where(listItem => listItem.Index> ddlStartDayOfWeek.SelectedIndex) - 从ddlStartDayOfWeek中删除过滤的项目。我会尽力说出我的意思。我知道我可以使用foreach向ddlEndDayOfWeek添加新的列表项,但是我想知道如何使用LINQ来完成。 –

相关问题