无法转换'System.Web.UI.LiteralControl'类型的对象错误

时间:2012-10-19 17:07:46

标签: asp.net asp.net-mvc

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

我从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页面中删除查询字符串然后我手动插入值,那么它可以工作。 PLS。救命。 感谢

2 个答案:

答案 0 :(得分:9)

问题在于:

(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?
}

答案 1 :(得分:4)

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

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

你应该这样做:

(TextBox)GV_InlineEditing.Rows[0].Cells[2].FindControl("GV_Post_ID").Text;