8

我收到此错误:无法将“System.Web.UI.LiteralControl”类型的对象转换为“System.Web.Controls.TextBox”</p>

我从 ASPX 页面中的查询字符串输入文本输入框,代码如下:

<EditItemTemplate>
                        <asp:TextBox ID="GV_Post_ID" runat="server" text='<%# Request.QueryString["Post_ID"] %>'></asp:TextBox>
                    </EditItemTemplate>

但是当我运行它时,它会停在这里:

cmd.Parameters.Add("@Post_ID", SqlDbType.VarChar).Value = ((TextBox)GV_InlineEditing.Rows[0].Cells[2].Controls[0]).Text;

我得到了上面的错误。这是后面的代码:

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DSRConnectionString"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "INSERT INTO RCA_Events(Post_ID, Date, Description) VALUES(@Post_ID, @Date, @Description)";
            cmd.Parameters.Add("@Post_ID", SqlDbType.VarChar).Value = ((TextBox)GV_InlineEditing.Rows[0].Cells[2].Controls[0]).Text;
            cmd.Parameters.Add("@Date", SqlDbType.VarChar).Value = ((TextBox)GV_InlineEditing.Rows[0].Cells[3].Controls[0]).Text;
            cmd.Parameters.Add("@Description", SqlDbType.VarChar).Value = ((TextBox)GV_InlineEditing.Rows[0].Cells[4].Controls[0]).Text;

请注意,如果我从 ASPX 页面中删除查询字符串,然后手动插入该值,那么它可以工作。请。帮助。谢谢

4

2 回答 2

11

问题在这里:

(TextBox)GV_InlineEditing.Rows[0].Cells[2].Controls[0]

该单元格中的第一个控件不是TextBox您认为的那样。让我们假设GV_InlineEditing.Rows[0]安全地为您提供所需的行。做这样的事情:

TextBox myTextBox = GV_InlineEditing.Rows[0].FindControl("GV_Post_ID") as TextBox;
cmd.Parameters.Add("@Post_ID", SqlDbType.VarChar).Value = myTextBox.Text;

该代码可以像这样更安全:

TextBox myTextBox = GV_InlineEditing.Rows[0].FindControl("GV_Post_ID") as TextBox;
if (myTextBox != null)
{
    cmd.Parameters.Add("@Post_ID", SqlDbType.VarChar).Value = myTextBox.Text;
}
else
{
    // Do something here.  Default value for the post id?
}
于 2012-10-19T17:11:23.760 回答
5

问题是当您使用 Gridviews 并将Databound字段转换为ItemTemplates时,您将例如一个文本框添加到EditItemTemplate,然后将其自己的 ID 添加到该文本框,例如 txtProduct,函数 .controls [ 0]不会找不到它,它不知道您的文本框的 ID,因此在这种情况下,您必须提供要定位的 TextBox 的 ID。因此,您应该使用.FindControl("txtProduct")而不是使用.Controls[0]。在您的情况下,而不是:

(TextBox)GV_InlineEditing.Rows[0].Cells[2].Controls[0].Text;

你应该做这个:

(TextBox)GV_InlineEditing.Rows[0].Cells[2].FindControl("GV_Post_ID").Text;
于 2015-11-16T21:48:47.323 回答