2011-08-27 87 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來完成。 –

相關問題