C# 字典<;T>;列表的名称<;T>;和ASP.NET中的列表视图 序言
我问这个问题是因为即使我已经阅读了很多ListView资源,我仍然没有“理解”它 背景 我有一堆C# 字典<;T>;列表的名称<;T>;和ASP.NET中的列表视图 序言,c#,.net,asp.net,data-binding,listview,C#,.net,Asp.net,Data Binding,Listview,我问这个问题是因为即使我已经阅读了很多ListView资源,我仍然没有“理解”它 背景 我有一堆Foo,它们有一个与之相关联的项目列表(称为Bar),我将它们作为字典从数据访问/业务逻辑层中提取出来,该字典包含一个Foo及其相关的Bar。我想把网页上的这些项目放到一个ListView中,该视图在左侧保存Foo.Name,在右侧的下拉列表中保存List。(下面是我美丽的ASCII艺术作品): 列表视图 ------------------------------------------------
Foo
,它们有一个与之相关联的项目列表(称为Bar
),我将它们作为字典从数据访问/业务逻辑层中提取出来,该字典包含一个Foo
及其相关的Bar
。我想把网页上的这些项目放到一个ListView
中,该视图在左侧保存Foo.Name
,在右侧的下拉列表中保存List
。(下面是我美丽的ASCII艺术作品):
列表视图
------------------------------------------------------------------
|项目名称|下拉列表(列表)|
|---------------------------------| _____________________ |
|foo1 | | bar1 | v ||
| | |_______________|___| |
------------------------------------------------------------------
||下拉列表(列表的一部分)|
| | _____________________ |
|foo2 | | bar2 | v ||
| | |_______________|___| |
------------------------------------------------------------------
好吧,事情是这样的。这是一个列表视图;这些项从数据库中拉入词典
。我试图从字典中获取键值,使其显示在“项目名称”下,并试图使“列表栏”显示为列表视图右侧的下拉列表
类别图
----------------- -----------------
|富吧|
----------------- -----------------
|Id | |项目名称|
|名称| |项值|
|巴里德|
----------------- -----------------
总而言之,我想把Dictionary.Key“Name”放在ListView的左侧,Dictionary.Value(恰好是一个列表)放在右侧的DropdownList中
因此,对于每个键/值对,都有一个名称和一个下拉列表,其中包含每个键的值
但我(显然)遇到了问题,我希望有人能告诉我我做错了什么
代码隐藏:
受保护的字典
{
得到;
设置
}
受保护的void数据绑定列表(列出选定的foos)
{
System.Web.UI.WebControls.ListView lv=lv;
尝试
{
词典=
新字典();
foreach(选定foos中的int Foo)
{
//生成要添加为Dictionary.key的foo列表
添加(fooScalar,Bar)
}
foodirectionary=foodirectionary;
lv.DataSource=foodiodictionary;
lv.DataBind();
ddlListOfBars.DataSource=FooDictionary;
ddlListOfBars.DataValueField=“ItemValue”;
ddlListOfBars.DataTextField=“ItemName”;
ddlListOfBars.DataBind();
}
捕获(例外情况除外)
{
SetMessage(divFooMsg,“无法检索Foos:”+
例如消息,真的,真的);
}
ListView代码:
问题:
这是你想要的东西吗
<asp:ListView ID="lvFooList" runat="server">
<LayoutTemplate>
<asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
</LayoutTemplate>
<ItemSeparatorTemplate>
<hr />
</ItemSeparatorTemplate>
<ItemTemplate>
<asp:Label ID="lbName" runat="server"/>
<asp:DropDownList ID="ddlListOfBars" runat="server"></asp:DropDownList>
</ItemTemplate>
</asp:ListView>
然后我写了一个非常快速的测试
public class Foo
{
public string Name;
}
public class Bar
{
public string ItemName { get; set; }
public string ItemValue { get; set; }
}
protected void Page_Load(object sender, EventArgs e)
{
var fooKey1 = new Foo() {Name = "foo1"};
var barList1 = new List<Bar>()
{
new Bar() {ItemName = "bar1", ItemValue = "barV1"},
new Bar() {ItemName = "bar2", ItemValue = "barV2"}
};
var fooKey2 = new Foo() {Name = "foo2"};
var barList2 = new List<Bar>()
{
new Bar() {ItemName = "bar3", ItemValue = "barV3"},
new Bar() {ItemName = "bar4", ItemValue = "barV4"}
};
var dicFooBar = new Dictionary<Foo, List<Bar>>() {{fooKey1, barList1}, {fooKey2, barList2}};
lvFooList.ItemDataBound += lvFooList_ItemDataBound;
lvFooList.DataSource = dicFooBar;
lvFooList.DataBind();
}
void lvFooList_ItemDataBound(object sender, ListViewItemEventArgs e)
{
var dataItem = (ListViewDataItem)e.Item;
var fooBarList = (KeyValuePair<Foo, List<Bar>>)dataItem.DataItem;
((Label) dataItem.FindControl("lbName")).Text = fooBarList.Key.Name;
var ddlListOfBars = (DropDownList) dataItem.FindControl("ddlListOfBars");
ddlListOfBars.DataTextField = "ItemName";
ddlListOfBars.DataValueField = "ItemValue";
ddlListOfBars.DataSource = fooBarList.Value;
ddlListOfBars.DataBind();
}
公共类Foo
{
公共字符串名称;
}
公共类酒吧
{
公共字符串ItemName{get;set;}
公共字符串ItemValue{get;set;}
}
受保护的无效页面加载(对象发送方、事件参数e)
{
var fooKey1=new Foo(){Name=“foo1”};
var barList1=新列表()
{
新建条(){ItemName=“bar1”,ItemValue=“barV1”},
新建条(){ItemName=“bar2”,ItemValue=“barV2”}
};
var fooKey2=new Foo(){Name=“foo2”};
var barList2=新列表()
{
新建条(){ItemName=“bar3”,ItemValue=“barV3”},
新建条(){ItemName=“bar4”,ItemValue=“barV4”}
};
var dicFooBar=newdictionary(){{fooKey1,barList1},{fooKey2,barList2};
lv傻瓜列表.ItemDataBound+=lv傻瓜列表_ItemDataBound;
lvwulist.DataSource=dicFooBar;
lvjullist.DataBind();
}
void lv傻瓜列表_ItemDataBound(对象发送者,ListViewItemEventArgs e)
{
var dataItem=(ListViewDataItem)e.Item;
var fooBarList=(KeyValuePair)dataItem.dataItem;
((Label)dataItem.FindControl(“lbName”)).Text=fooBarList.Key.Name;
var ddlListOfBars=(DropDownList)dataItem.FindControl(“ddlListOfBars”);
ddlListOfBars.DataTextField=“ItemName”;
ddlListOfBars.DataValueField=“ItemValue”;
ddlListOfBars.DataSource=fooBarList.Value;
ddlListOfBars.DataBind();
}
似乎做了您想做的事情,但我的代码只是快速测试代码,所以请注意。它确实按预期呈现。您的问题出现了,因为在DataBindWighList()中数据绑定ddlListOfBars没有意义,因为da不只是一个DropDownList
protected Dictionary<Foo, List<Bar>> FooDictionary
{
get;
set;
}
protected void DataBindFooList(List<int> SelectedFoos)
{
System.Web.UI.WebControls.ListView lv = lvFooList;
try
{
Dictionary<Foo, List<Bar>> fooDictionary =
new Dictionary<Foo, List<Bar>>();
foreach (int Foo in SelectedFoos)
{
// Build List of Foos to add as Dictionary.Keys
fooDictionary.Add(fooScalar, Bar)
}
FooDictionary = fooDictionary;
lv.DataSource = FooDictionary;
lv.DataBind();
ddlListOfBars.DataSource = FooDictionary;
ddlListOfBars.DataValueField = "ItemValue";
ddlListOfBars.DataTextField = "ItemName";
ddlListOfBars.DataBind();
}
catch (Exception ex)
{
SetMessage(divFooMsg, "Unable to retrieve Foos: " +
ex.Message, true, true);
}
<asp:ListView ID="lvFooList" runat="server">
<LayoutTemplate>
<asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
</LayoutTemplate>
<ItemSeparatorTemplate>
<hr />
</ItemSeparatorTemplate>
<ItemTemplate>
<%#Eval("Name") %>
<asp:DropDownList ID="ddlListOfBars" runat="server"></asp:DropDownList>
</ItemTemplate>
</asp:ListView>
<asp:ListView ID="lvFooList" runat="server">
<LayoutTemplate>
<asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
</LayoutTemplate>
<ItemSeparatorTemplate>
<hr />
</ItemSeparatorTemplate>
<ItemTemplate>
<asp:Label ID="lbName" runat="server"/>
<asp:DropDownList ID="ddlListOfBars" runat="server"></asp:DropDownList>
</ItemTemplate>
</asp:ListView>
public class Foo
{
public string Name;
}
public class Bar
{
public string ItemName { get; set; }
public string ItemValue { get; set; }
}
protected void Page_Load(object sender, EventArgs e)
{
var fooKey1 = new Foo() {Name = "foo1"};
var barList1 = new List<Bar>()
{
new Bar() {ItemName = "bar1", ItemValue = "barV1"},
new Bar() {ItemName = "bar2", ItemValue = "barV2"}
};
var fooKey2 = new Foo() {Name = "foo2"};
var barList2 = new List<Bar>()
{
new Bar() {ItemName = "bar3", ItemValue = "barV3"},
new Bar() {ItemName = "bar4", ItemValue = "barV4"}
};
var dicFooBar = new Dictionary<Foo, List<Bar>>() {{fooKey1, barList1}, {fooKey2, barList2}};
lvFooList.ItemDataBound += lvFooList_ItemDataBound;
lvFooList.DataSource = dicFooBar;
lvFooList.DataBind();
}
void lvFooList_ItemDataBound(object sender, ListViewItemEventArgs e)
{
var dataItem = (ListViewDataItem)e.Item;
var fooBarList = (KeyValuePair<Foo, List<Bar>>)dataItem.DataItem;
((Label) dataItem.FindControl("lbName")).Text = fooBarList.Key.Name;
var ddlListOfBars = (DropDownList) dataItem.FindControl("ddlListOfBars");
ddlListOfBars.DataTextField = "ItemName";
ddlListOfBars.DataValueField = "ItemValue";
ddlListOfBars.DataSource = fooBarList.Value;
ddlListOfBars.DataBind();
}
<ItemTemplate>
<%#Eval("Key.Name") %>
<asp:DropDownList
ID="ddlListOfBars"
runat="server"
DataSource='<%#Eval("Value")%>'
DataValueField="ItemValue"
DataTextField="ItemName" />
</ItemTemplate>
<asp:ListView ID="lvFooList" runat="server">
<LayoutTemplate>
<asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
</LayoutTemplate>
<ItemSeparatorTemplate>
<hr />
</ItemSeparatorTemplate>
<ItemTemplate>
<uc:ListViewContents DataItem='<%# Container.DataItem %>' />
</ItemTemplate>
<asp:Label ID="lbName" runat="server"/>
<asp:DropDownList ID="ddlListOfBars" runat="server"></asp:DropDownList>
public KeyValuePair<Foo,List<Bar>> DataItem
{
get; set;
}
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding(e);
lbName.Text = DataItem.Key.Name;
ddlListOfBars.DataTextField = "ItemName";
ddlListOfBars.DataValueField = "ItemValue";
ddlListOfBars.DataSource = DataItem.Value;
ddlListOfBars.DataBind();
}