将项目子集从一个RadComboBox复制到另一个
本文关键字:RadComboBox 一个 复制 另一个 子集 项目 | 更新日期: 2023-09-27 18:06:59
我试图复制 RadComboBoxItems的子集从一个RadComboBox到另一个。目前,我正试图使用enumerable 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()方法的结果放入列表中,希望如果我不直接从项目集合中工作,那么ddlStartDayOfWeek就不会受到影响,但这也不起作用。
如果可能的话,我想找到一个类似于我现在正在做的解决方案。如果你能帮我解决这个问题,我将非常感激。
没有尝试过,但似乎这是因为您正在添加RadComboBoxItem对象,已经存在于页面到另一个RadComboBox。你只需要将所选RadComboBoxItem集合的值和文本复制到新的RadComboBoxItems中,而不是(可能)将对象本身从一个RadComboBox移动到另一个RadComboBox中。
我希望用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;
}
我非常感谢其他人的贡献,也欢迎新的答案!