2012-10-19 45 views
6

Tôi nhận được lỗi này: Không thể truyền đối tượng thuộc loại 'System.Web.UI.LiteralControl' để nhập 'System.Web.Controls. TextBox'Không thể truyền đối tượng loại 'System.Web.UI.LiteralControl' Lỗi

tôi đang ăn hộp nhập văn bản của tôi từ một chuỗi truy vấn trong trang aSPX và đây là mã:

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

Nhưng khi tôi chạy nó, nó dừng lại ở đây:

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

và tôi nhận được lỗi ở trên. Đây là mã đằng sau:

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; 

Xin lưu ý nếu tôi xóa chuỗi truy vấn khỏi trang ASPX và sau đó tôi chèn giá trị theo cách thủ công thì nó hoạt động. Xin lỗi. Cứu giúp. nhờ

Trả lời

9

Vấn đề là ở đây:

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

Việc kiểm soát đầu tiên trong tế bào đó không phải là TextBox bạn nghĩ rằng đó là. Giả sử GV_InlineEditing.Rows[0] sẽ giúp bạn nhận được hàng mà bạn cần. Làm một cái gì đó như thế này:

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

Đó là mã có thể còn an toàn hơn như thế này:

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

cảm ơn bạn rất nhiều. điều này giải quyết được vấn đề của tôi. – moe

+1

@Gromer: Cảm ơn Man, nó đã cứu ngày của tôi .. Đã giải quyết – BNN

3

Vấn đề là khi bạn đang sử dụng GridViews và bạn chuyển đổi databound trường vào ItemTemplates, và bạn thêm ví dụ một hộp văn bản vào EditItemTemplate và sau đó bạn thêm ID riêng của nó vào hộp văn bản đó, ví dụ: txtProduct, hàm .controls [0] won ' t tìm thấy nó, nó không biết ID của hộp văn bản của bạn, vì vậy trong trường hợp này bạn sẽ phải cung cấp ID của TextBox mà bạn muốn nhắm mục tiêu. Vì vậy, thay vì sử dụng .Control [0] bạn nên sử dụng .FindControl ("txtProduct"). Trong trường hợp của bạn thay vì:

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

bạn nên làm điều này:

(TextBox)GV_InlineEditing.Rows[0].Cells[2].FindControl("GV_Post_ID").Text; 
Các vấn đề liên quan