C# ASP.NET-如何从下拉列表SelectMethod属性中查找ListView中的控件

C# ASP.NET-如何从下拉列表SelectMethod属性中查找ListView中的控件,c#,asp.net,listview,drop-down-menu,C#,Asp.net,Listview,Drop Down Menu,我有一个包含标签和下拉列表的ListView。我想使用下拉列表的SelectMethod属性中的FindControl()查找标签。这是我的密码: .aspx: <asp:ListView ID="ListView1" runat="server" DataKeyNames="ID" ItemType="Models.Items" SelectMethod="GetItem"> <ItemTemplate> <asp:Label ID

我有一个包含标签和下拉列表的ListView。我想使用下拉列表的SelectMethod属性中的
FindControl()
查找标签。这是我的密码:

.aspx:

<asp:ListView ID="ListView1" runat="server" DataKeyNames="ID"
    ItemType="Models.Items" SelectMethod="GetItem">
    <ItemTemplate>
        <asp:Label ID="LabelItemId" runat="server"
            Text="<%#: Item.ID %>"></asp:Label>
        <asp:DropDownList ID="DropDownList1" runat="server" 
            SelectMethod="GetCategories" ItemType="Models.Category"
            DataValueField="CategoryID" DataTextField="CategoryName">
        </asp:DropDownList>
protected void GetCategories(object sender, ListViewItemEventArgs e)
    {
        using (var db = new ItemContext())
        {
            var dropDownList = (DropDownList)e.Item.FindControl("DropDownList1");
            IQueryable<Category> query = db.Categories;
            List<Category> categories = query.ToList();

            //The line below is the problem because e is null
            var item = categories.First(category => category.CategoryID == 
                    Convert.ToInt32(((Label)e.Item.FindControl("LabelItemId")).Text));
        }
    }
        protected void DropDownList1_DataBound(object sender, EventArgs e)
            {
                var control = (Control)sender;
                var lvi = (ListViewItem)control.NamingContainer;
                var label = (Label)lvi.FindControl("LabelCategoryId");
                string text = label.Text;
                var ddl = (DropDownList)sender;
                ddl.SelectedValue = text;
            }

C#:

<asp:ListView ID="ListView1" runat="server" DataKeyNames="ID"
    ItemType="Models.Items" SelectMethod="GetItem">
    <ItemTemplate>
        <asp:Label ID="LabelItemId" runat="server"
            Text="<%#: Item.ID %>"></asp:Label>
        <asp:DropDownList ID="DropDownList1" runat="server" 
            SelectMethod="GetCategories" ItemType="Models.Category"
            DataValueField="CategoryID" DataTextField="CategoryName">
        </asp:DropDownList>
protected void GetCategories(object sender, ListViewItemEventArgs e)
    {
        using (var db = new ItemContext())
        {
            var dropDownList = (DropDownList)e.Item.FindControl("DropDownList1");
            IQueryable<Category> query = db.Categories;
            List<Category> categories = query.ToList();

            //The line below is the problem because e is null
            var item = categories.First(category => category.CategoryID == 
                    Convert.ToInt32(((Label)e.Item.FindControl("LabelItemId")).Text));
        }
    }
        protected void DropDownList1_DataBound(object sender, EventArgs e)
            {
                var control = (Control)sender;
                var lvi = (ListViewItem)control.NamingContainer;
                var label = (Label)lvi.FindControl("LabelCategoryId");
                string text = label.Text;
                var ddl = (DropDownList)sender;
                ddl.SelectedValue = text;
            }
受保护的void GetCategories(对象发送方,ListViewItemEventArgs e)
{
使用(var db=new ItemContext())
{
var dropDownList=(dropDownList)e.Item.FindControl(“DropDownList1”);
IQueryable query=db.Categories;
列表类别=query.ToList();
//下一行是问题所在,因为e为null
var item=categories.First(category=>category.CategoryID==
将.ToInt32(((标签)e.Item.FindControl(“LabelItemId”).Text));
}
}

问题是
ListViewItemEventArgs
e
为空。因此,我得到了一个
NullReferenceException
。可能原因是我不应该将
ListViewItemEventArgs
用于
SelectMethod
属性。如果是这样,我应该用什么

您需要迭代一个循环以获得标签值,如下所示:

foreach (ListViewItem item in ListView1.Items)
{
    Label mylabel = (Label)item.FindControl("Label1");
    lblID.Text = mylabel.Text;
}
注意:这也适用于其他控件

如果它不起作用,还有另一个解决方案。请执行以下操作:

ListViewItem item = ListView1.Items[ListView1.SelectedIndex];  
Label myLabel = (Label)item.FindControl("Label1");

string result = myLabel.text; //Get the text here

您需要迭代循环以获得标签值,如下所示:

foreach (ListViewItem item in ListView1.Items)
{
    Label mylabel = (Label)item.FindControl("Label1");
    lblID.Text = mylabel.Text;
}
注意:这也适用于其他控件

如果它不起作用,还有另一个解决方案。请执行以下操作:

ListViewItem item = ListView1.Items[ListView1.SelectedIndex];  
Label myLabel = (Label)item.FindControl("Label1");

string result = myLabel.text; //Get the text here

只需将
OnDataBound
属性添加到
DropDownList
并为
OnDataBound
事件编写此方法:

C#:

<asp:ListView ID="ListView1" runat="server" DataKeyNames="ID"
    ItemType="Models.Items" SelectMethod="GetItem">
    <ItemTemplate>
        <asp:Label ID="LabelItemId" runat="server"
            Text="<%#: Item.ID %>"></asp:Label>
        <asp:DropDownList ID="DropDownList1" runat="server" 
            SelectMethod="GetCategories" ItemType="Models.Category"
            DataValueField="CategoryID" DataTextField="CategoryName">
        </asp:DropDownList>
protected void GetCategories(object sender, ListViewItemEventArgs e)
    {
        using (var db = new ItemContext())
        {
            var dropDownList = (DropDownList)e.Item.FindControl("DropDownList1");
            IQueryable<Category> query = db.Categories;
            List<Category> categories = query.ToList();

            //The line below is the problem because e is null
            var item = categories.First(category => category.CategoryID == 
                    Convert.ToInt32(((Label)e.Item.FindControl("LabelItemId")).Text));
        }
    }
        protected void DropDownList1_DataBound(object sender, EventArgs e)
            {
                var control = (Control)sender;
                var lvi = (ListViewItem)control.NamingContainer;
                var label = (Label)lvi.FindControl("LabelCategoryId");
                string text = label.Text;
                var ddl = (DropDownList)sender;
                ddl.SelectedValue = text;
            }

这将根据
列表视图中每个项目的标签文本更改
下拉列表的
SelectedValue

只需将
OnDataBound
属性添加到
DropDownList
并为
OnDataBound
事件编写此方法:

C#:

<asp:ListView ID="ListView1" runat="server" DataKeyNames="ID"
    ItemType="Models.Items" SelectMethod="GetItem">
    <ItemTemplate>
        <asp:Label ID="LabelItemId" runat="server"
            Text="<%#: Item.ID %>"></asp:Label>
        <asp:DropDownList ID="DropDownList1" runat="server" 
            SelectMethod="GetCategories" ItemType="Models.Category"
            DataValueField="CategoryID" DataTextField="CategoryName">
        </asp:DropDownList>
protected void GetCategories(object sender, ListViewItemEventArgs e)
    {
        using (var db = new ItemContext())
        {
            var dropDownList = (DropDownList)e.Item.FindControl("DropDownList1");
            IQueryable<Category> query = db.Categories;
            List<Category> categories = query.ToList();

            //The line below is the problem because e is null
            var item = categories.First(category => category.CategoryID == 
                    Convert.ToInt32(((Label)e.Item.FindControl("LabelItemId")).Text));
        }
    }
        protected void DropDownList1_DataBound(object sender, EventArgs e)
            {
                var control = (Control)sender;
                var lvi = (ListViewItem)control.NamingContainer;
                var label = (Label)lvi.FindControl("LabelCategoryId");
                string text = label.Text;
                var ddl = (DropDownList)sender;
                ddl.SelectedValue = text;
            }

这将根据
列表视图中每个项目的标签文本更改
下拉列表的
SelectedValue
当我使用foreach时,它甚至不会进入foreach循环。这很奇怪,因为我的listview好像没有任何项目,但它有。我已经更新了帖子。看看是否有帮助。对我来说,它工作得很好。在什么情况下我应该把代码放在哪里?目前,我把它放在我的dropdownlist
SelectMethod
属性中,因为我希望dropdownlist的
SelectedValue
与标签文本相同。当我尝试你的新代码时,它仍然说我的
列表视图中没有任何项目。似乎
列表视图
尚未加载。不过,我已经找到了解决方案。我触发
dropdownlist
OnDataBound
事件,然后使用
objectsender
参数访问
ListViewItem
NamingContainer
属性。从那里,我可以使用
FindControl()
来获取标签文本。当我使用foreach时,它甚至不进入foreach循环。这很奇怪,因为我的listview好像没有任何项目,但它有。我已经更新了帖子。看看是否有帮助。对我来说,它工作得很好。在什么情况下我应该把代码放在哪里?目前,我把它放在我的dropdownlist
SelectMethod
属性中,因为我希望dropdownlist的
SelectedValue
与标签文本相同。当我尝试你的新代码时,它仍然说我的
列表视图中没有任何项目。似乎
列表视图
尚未加载。不过,我已经找到了解决方案。我触发
dropdownlist
OnDataBound
事件,然后使用
objectsender
参数访问
ListViewItem
NamingContainer
属性。从那里,我可以使用
FindControl()
获取标签文本。