C# 字典<;T>;列表的名称<;T>;和ASP.NET中的列表视图 序言

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艺术作品): 列表视图 ------------------------------------------------

我问这个问题是因为即使我已经阅读了很多ListView资源,我仍然没有“理解”它

背景 我有一堆
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();   
    }