【问题标题】:how to get Text value from TextBox in Datalist如何从 Datalist 中的 TextBox 获取文本值
【发布时间】:2017-07-10 08:18:48
【问题描述】:

当我单击 LinkBut​​ton 时,我试图从 TextBox 中检索 Text 值,这两者都在 DataList 的 ItemTemplate 中。但它返回的是 null 值。

这是aspx页面中datalist的代码:

 <asp:DataList ID="DataList1" runat="server" Width="100%" DataKeyField="UserId" OnItemCommand="itemcommand"
                OnItemDataBound="Data_Bind">
                <ItemTemplate>
                    <table style="width: 100%">
                        <tr>
                            <td>
                                <a href="<%#System.String.Format("ViewProfile.aspx?aid={0}",Eval("UserId")) %>">
                                    <asp:Image ID="Img" Width="100px" Height="80px" BorderStyle="Inset" BorderWidth="2px"
                                        BorderColor="Aqua" runat="server" ImageUrl='<%#System.String.Format("../Content/Upload/{0}", Eval("UserDetail.UserPhoto")) %>' />
                            </td>
                            <td >
                                <asp:Label ID="name" runat="server" Text='<%#Eval("UserDetail.Firstname")%>'></asp:Label>
                                <asp:Label ID="lastname" runat="server" Text='<%#Eval("UserDetail.Lastname")%>'></asp:Label>
                            </td>
                            <td>
                                <asp:Label ID="post" runat="server" Text='<%#Eval("Post.post")%>'></asp:Label>
                            </td>
                        </tr>
                        <tr>
                            <td colspan="3">
                                <asp:LinkButton ID="Like" runat="server" CommandName="onLike" CommandArgument='<%# Eval("Post.PostId") %>'>Like</asp:LinkButton>
                                <asp:Label ID="lk" runat="server"></asp:Label>
                                <asp:LinkButton ID="Share" runat="server" CommandName="onShare" CommandArgument='<%# Eval("Post.PostId") %>'>Share</asp:LinkButton>
                                <asp:Label ID="sh" runat="server"></asp:Label>
                            </td>
                        </tr>
                        <tr>
                        <td colspan="3">
                          <asp:TextBox ID="txtcomment"  runat="server" Height="40px" Text="abc" Width="600px"></asp:TextBox>
                          <input type="text" id="cmnt1" name="cmnt1" runat="server" />
                           &nbsp;
                            <asp:LinkButton ID="Comment" runat="server" CommandName="onComment" CommandArgument='<%# Eval("Post.PostId") %>'>Comment</asp:LinkButton>
                        </td>
                        </tr>
                        <tr>
                            <td colspan="3">
                                <asp:DataList ID="DataList2" runat="server">
                                    <ItemTemplate>
                                        <table>
                                            <tr>
                                                <td>
                                                    <asp:Image ID="Img2" Width="50px" Height="40px" BorderStyle="Inset" BorderWidth="2px"
                                                        BorderColor="Aqua" runat="server" ImageUrl='<%#System.String.Format("../Content/Upload/{0}", Eval("UserDetail.UserPhoto")) %>' />
                                                    <asp:Label ID="fname" runat="server" Text='<%#Eval("UserDetail.Firstname")%>'></asp:Label>
                                                    <asp:Label ID="lname" runat="server" Text='<%#Eval("UserDetail.Lastname")%>'></asp:Label>
                                                </td>
                                                <td>
                                                    <asp:Label runat="server" ID="cmnts" Text='<%#Eval("Comments.Comment")%>'></asp:Label>
                                                </td>
                                            </tr>
                                        </table>
                                    </ItemTemplate>
                                </asp:DataList>
                            </td>
                        </tr>
                    </table>
                </ItemTemplate>

            </asp:DataList>

这是背后的代码:

 protected void itemcommand(object source, DataListCommandEventArgs e)
    {
        if (e.CommandName == "onLike")
        {
            var k = e.CommandArgument;

            User ObjUser = new User();
            ObjUser = (User)Session["user"];
            ObjUser.Post.PostId = Convert.ToInt64(k);

            PostService.OnLike(ObjUser);

            DataList1.DataSource = PostService.GetPosts(ObjUser);
            DataList1.DataBind();
        }
        if (e.CommandName == "onComment")
        {
            var k = e.CommandArgument;

            TextBox cmnt = (TextBox) e.Item.FindControl("txtcomment");
            HtmlInputText cmnt1 = (HtmlInputText)e.Item.FindControl("cmnt1");
            User ObjUser = new User();
            ObjUser = (User)Session["user"];
            ObjUser.Post.PostId = Convert.ToInt64(k);
            ObjUser.Comments.Comment = cmnt.Text;

            PostService.OnComment(ObjUser);

            DataList1.DataSource = PostService.GetPosts(ObjUser);
            DataList1.DataBind();

        }
        if (e.CommandName == "onShare")
        {
            var k = e.CommandArgument;

            User ObjUser = new User();
            ObjUser = (User)Session["user"];
            ObjUser.Post.PostId = Convert.ToInt64(k);

            PostService.OnShare(ObjUser);

            DataList1.DataSource = PostService.GetPosts(ObjUser);
            DataList1.DataBind();

        }

    }

【问题讨论】:

    标签: c# asp.net textbox datalist


    【解决方案1】:

    FindControl 不会递归搜索控件。它只会在当前子项中查找控件。鉴于您使用的结构,您必须在项目的子控件中进行搜索。

    您必须编写自己的递归函数来搜索所有子控件以查找此控件。

    或者你可以编写一个扩展方法,这样你就可以使用它来递归搜索你需要的地方。我找到的这个函数here 应该会有所帮助。

    public static class ControlExtensions
    {
        public static Control FindControlRecursive(this Control control, string id)
        {
            if (control == null) return null;
            //try to find the control at the current level
            Control ctrl = control.FindControl(id);
            if (ctrl == null)
            {
                //search the children
                foreach (Control child in control.Controls)
                {
                    ctrl = FindControlRecursive(child, id);
                    if (ctrl != null) break;
                }
            }
            return ctrl;
        }
    }
    

    【讨论】:

    • 我不明白,所有的链接按钮都可以访问,但文本框不是。我认为文本框控件是数据列表的直接子项,就像其他控件一样。我可以找到文本框控件但它的文本值为空。
    【解决方案2】:
    asp:TextBox ID="txtQuantity"  runat="server"></asp:TextBox
    
    string Key = Datalist.DataKeys[e.Item.ItemIndex].ToString();
    
    TextBox Textboxvalue = (TextBox)(e.Item.FindControl("txtQuantity"));
    
    //You will get the value in Textboxvalue 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      相关资源
      最近更新 更多