如何使用itemcommand w / datalist&按钮w / out对象引用错误?

时间:2011-01-20 22:22:44

标签: c# asp.net ajax visual-studio

我在c#ASP.NET中,我对这一切都不熟悉。试图教自己,但我挂了一些我认为应该简单的东西。我在这里找不到搜索的答案因为我想我不知道用什么方法来描述我正在寻找的东西。所以我最后采取了欺骗你们的答案。

请非常基本,我很新但很渴望。

我有一个数据列表从数据库(MSSQL)返回X个结果 - 每个结果都附带一些信息,然后是2个文本框和一个按钮。我希望他们能够在每个框中输入一些信息,单击一个按钮,然后将其插回到我的SQL数据库中。

我希望每个文本框中的文本结果以及id(从datalist的结果返回的sql值)与它一起使用(以便我的插入知道这是来自哪个结果)

所以我的页面看起来像

text 1 - TEXTBOX - TEXTBOX - BUTTON text 2 - etc etc

如果该家伙填写了文本2的2个文本框并单击了text2的按钮,我将(textbox1.text,textbox2.text,“text 2”)插入到我的数据库中

到目前为止,这就是我在代码背后的代码所在:

protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
    Button Button2b = (Button)e.Item.FindControl("Button2");
    TextBox TextBox2b = (TextBox)e.Item.FindControl("TextBox2");
    TextBox TextBox3b = (TextBox)e.Item.FindControl("TextBox3");

    SqlDataSource commentinsert = new SqlDataSource();
    commentinsert.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
    commentinsert.InsertCommandType = SqlDataSourceCommandType.Text;
    commentinsert.InsertCommand = "INSERT INTO ocomments (cuser, date, ip, blogid, text) VALUES (@cuser, @date, @ip, @blogid, @text)";
    commentinsert.InsertParameters.Add("cuser", TextBox2b.Text);
    commentinsert.InsertParameters.Add("date", DateTime.Now.ToString());
    commentinsert.InsertParameters.Add("ip", Request.UserHostAddress.ToString());
    commentinsert.InsertParameters.Add("blogid", "16");
    commentinsert.InsertParameters.Add("text", TextBox3b.Text);
    commentinsert.Insert();
}

这是我的aspx中的相关datalist

<asp:DataList ID="DataList1" runat="server" DataKeyField="id" 
            DataSourceID="SqlDataSource1" style="width:700px;" onitemdatabound="DataList1_ItemDataBound" 
                                onitemcommand="DataList1_ItemCommand">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Eval("subject") %>' style="font-size:25pt;font-family:Tahoma;"></asp:Label>
                <asp:Label ID="Label2" runat="server" Text='<%# Eval("auser", " - {0}") %>' style="font-size:15pt;color:#74daf8;font-family:Tahoma;"></asp:Label>
                <br />
            <hr width="80%" size="1" NOSHADE color="#343a68" />
                <asp:Label style="font-size:14pt;font-family:Tahoma;font-weight:normal;" ID="Label3" runat="server" Text='<%# Eval("body") %>' />

                <asp:HyperLink ID="HyperLink5" runat="server" 
                    NavigateUrl='<%# Eval("id", "http://domain.com/?id={0}#{0}") %>' 
                    Visible="False">edit</asp:HyperLink>
                    <br />
                    <span style="float:right;">
                <asp:HyperLink ID="HyperLink7" runat="server" style="cursor:pointer;font-family:Tahoma;
                    font-size:12pt;color:White;"># comments - add a comment</asp:HyperLink>
                    </span>
                <br />
                        <asp:Panel ID="Panel2" runat="server" style="display:none;width:600px;
                            background-color:Black;margin: 10px 0 10px 10px;padding: 5px 0 10px 10px;">
                        your name:
                        <br />
                            <asp:TextBox ID="TextBox2" runat="server" Width="250px"></asp:TextBox>
                            <br />
                            your comment:
                            <br />
                            <asp:TextBox ID="TextBox3" runat="server" Width="550px" height="150px" TextMode="MultiLine"></asp:TextBox>
                            <br />
                            <asp:Button ID="Button2" runat="server"   
                                Text="Send Comment" Width="200px" Height="35px" Font-Bold="False" Font-Names="tahoma"
                             Font-Size="17pt" CommandArgument='<%# Eval("id") %>' />
                        </asp:Panel>

            <hr width="30%" size="1" align="right" NOSHADE color="#696969" />
            </ItemTemplate>
        </asp:DataList>

这是我点击发送评论按钮时得到的错误,即使我在文本框中有文本我正试图从中提取数据:

'/'应用程序中的服务器错误。 你调用的对象是空的。

请帮忙!

编辑:尝试了每个用户建议的以下代码,但我收到了完全相同的错误。

Control panelControl = e.Item.FindControl("Panel2");
    Button Button2b = panelControl.FindControl("Button2") as Button;
    TextBox TextBox2b = panelControl.FindControl("TextBox2") as TextBox;
    TextBox TextBox3b = panelControl.FindControl("TextBox3") as TextBox;

    SqlDataSource commentinsert = new SqlDataSource();
    commentinsert.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
    commentinsert.InsertCommandType = SqlDataSourceCommandType.Text;
    commentinsert.InsertCommand = "INSERT INTO ocomments (cuser, date, ip, blogid, text) VALUES (@cuser, @date, @ip, @blogid, @text)";
    commentinsert.InsertParameters.Add("cuser", TextBox2b.Text);
    commentinsert.InsertParameters.Add("date", DateTime.Now.ToString());
    commentinsert.InsertParameters.Add("ip", Request.UserHostAddress.ToString());
    commentinsert.InsertParameters.Add("blogid", Button2b.CommandArgument.ToString());
    commentinsert.InsertParameters.Add("text", TextBox3b.Text);
    commentinsert.Insert();

1 个答案:

答案 0 :(得分:1)

这是因为您的Button控件和Textbox控件在Panel中,FIndControl搜索了Immediate子元素。 将处理程序更改为:

protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e) 
{ 
    Control panelControl = e.Item.FindControl("Panel2");     
    Button Button2b = panelControl.FindControl("Button2") as Button;     
    TextBox TextBox2b = panelControl.FindControl("TextBox2") as TextBox;     
    TextBox TextBox3b = panelControl.FindControl("TextBox3") as TextBox; 
    .
    .
    .
    .