【发布时间】:2015-02-10 05:20:37
【问题描述】:
我有 3 个下拉列表 2 具有相同的来源,第 3 个具有选定列表。如果选择的列表不为空,我应该从第一个中删除选择,并在第三个中绑定。第二个是显示原始列表的静态。
但我不知道如何在对象中进行 foreach。
错误:foreach 语句不能对“object”类型的变量进行操作 因为“对象”不包含公共定义 'GetEnumerator'
public void DataSource(object source, object select, string Value = "UId", string Text = "Text")
{
ddlThis.DataSource = source;
ddlThis.DataTextField = Text;
ddlThis.DataValueField = Value;
ddlThis.DataBind();
ddlThisHidden.DataSource = source;
ddlThisHidden.DataTextField = Text;
ddlThisHidden.DataValueField = Value;
ddlThisHidden.DataBind();
if (select != null)
{
ddlOther.DataSource = select;
ddlOther.DataTextField = Text;
ddlOther.DataValueField = Value;
ddlOther.DataBind();
foreach (var item in ddlOther.DataSource)
ddlThis.Items.Remove(item);
}
}
第 2 版
public void DataSource(IList source, IList select, string Value = "UId", string Text = "Text")
{
ddlThis.DataSource = source;
ddlThis.DataTextField = Text;
ddlThis.DataValueField = Value;
ddlThis.DataBind();
ddlThisHidden.DataSource = source;
ddlThisHidden.DataTextField = Text;
ddlThisHidden.DataValueField = Value;
ddlThisHidden.DataBind();
if (select != null)
{
ddlOther.DataSource = source.Cast<object>()
.Select(x => select.Cast<object>().Any(c=> c.GetType().GetProperty(Value).GetValue(source, null).ToString() == x.GetType().GetProperty(Value).GetValue(source, null).ToString()));
ddlOther.DataTextField = Text;
ddlOther.DataValueField = Value;
ddlOther.DataBind();
foreach (var item in select)
ddlThis.Items.Remove(item.ToString());
}
}
版本 3 工作!
public void DataSource(object source, object select, string Value = "UId", string Text = "Text")
{
ddlThis.DataSource = source;
ddlThis.DataTextField = Text;
ddlThis.DataValueField = Value;
ddlThis.DataBind();
ddlThisHidden.DataSource = source;
ddlThisHidden.DataTextField = Text;
ddlThisHidden.DataValueField = Value;
ddlThisHidden.DataBind();
if (select != null)
{
ddlOther.DataSource = ((IEnumerable)source).Cast<dynamic>().ToList().FindAll(x => ((IEnumerable)select).Cast<dynamic>()
.Any(c => c.GetType().GetProperty(Value).GetValue(c, null) == x.GetType().GetProperty(Value).GetValue(x, null)));
ddlOther.DataTextField = Text;
ddlOther.DataValueField = Value;
ddlOther.DataBind();
foreach (var item in (dynamic)(ddlOther.DataSource))
ddlThis.Items.Remove(item.ToString());
}
}
【问题讨论】:
-
你不能。对象本身(比 System.Object 更派生的类型)必须实现 IEnumerable 才能通过它。 ddlOther.DataSource 对我来说似乎是 system.object 类型。为什么“源”是对象?这就是问题所在。
-
DataSource是一个object,我想你想遍历ddlOther.Items -
我很想知道您为什么将传递的值声明为对象而不是特定的 IList 对象
-
好的,我正在将对象更改为 IList,我想应该可以。
-
我改为 IList,但现在得到“对象与目标类型不匹配”。在“ddlOther.DataSource”中