0

我有这个代码:

protected void Button1_Click(object sender, EventArgs e)
    {
        System.Data.SqlClient.SqlConnection sc = new System.Data.SqlClient.SqlConnection(GetConnectionString());
        {
            System.Data.SqlClient.SqlCommand cmd;
            sc.Open();
            cmd = new System.Data.SqlClient.SqlCommand("SET IDENTITY_INSERT Zapas OFF INSERT INTO Zapas (Zapas.Sezona,.....)SELECT Zapas.Sezona,... FROM Zapas WHERE ID_zapas=@ID;", sc);
            cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@ID", System.Data.SqlDbType.Text)).Value = (TextBox)ListView1.FindControl("box1"); 

            cmd.ExecuteNonQuery();
            sc.Close();
            Response.Redirect("~/Zapasy_seznam.aspx");
        }
    }

我需要从 listview 中获取值 ID,但是使用此代码时出现此错误:

...expects the parameter '@ID', which was not supplied....

我的列表视图的这一部分...

<asp:ListView ID="ListView1" runat="server" DataKeyNames="ID_zapas" DataSourceID="SqlDataSource1" style="text-align: center ">       
                    <AlternatingItemTemplate>
                        <tr style="background-color: #e9ffe9;color: #284775;text-align:center">
                            <td>
                                <asp:TextBox ID="box1" runat="server" Text='<%# Eval("ID_zapas") %>' Visible="false" />

...

<td style="width:50px;background-color:white">
                                <asp:LinkButton ID="Button1" runat="server" OnClick="Button1_Click" Visible='<%# HttpContext.Current.User.IsInRole("admin") %>' CausesValidation="False" OnClientClick="javascript: return confirm('Opravdu chcete zápas zkopírovat?');">
                                     <asp:Image ID="Image2" runat="server" ImageUrl="~/Icons/copy.png" Width="29px" Height="29px" ToolTip="Zkopírovat zápas" />
                                </asp:LinkButton>
                            </td>                      
                        </tr>
                    </AlternatingItemTemplate>

你有什么想法吗?

4

1 回答 1

1

根据评论,请尝试以下操作:

using System.Data.SqlClient;

protected void Button1_Click(object sender, EventArgs e)
{
    var box1 = (TextBox)((LinkButton)sender).Parent.FindControl("box1");
    using (var sc = new SqlConnection(GetConnectionString()))
    {
        using (var cmd = sc.CreateCommand())
        {
            sc.Open();
            cmd.CommandText = "SET IDENTITY_INSERT Zapas OFF INSERT INTO Zapas (Zapas.Sezona,.....)SELECT Zapas.Sezona,... FROM Zapas WHERE ID_zapas=@ID;";
            cmd.Parameters.AddWithValue("@ID", box1.Text);

            cmd.ExecuteNonQuery();
            sc.Close();
            Response.Redirect("~/Zapasy_seznam.aspx");
        }
    }
}

当使用数据感知控件(例如ListView此处)时,控件将使用每个数据项的自动唯一 ID 创建。这意味着您可以在数据项(((LinkButton)sender).ParentListViewDataItem表示行)应引用的页面内拥有多个相同的控件(例如本例中的“box1”)。

ListViewDataItem.FindControl将在其自己的子范围内找到特定服务器 ID 的控件,从而允许您获取正在单击的按钮的同一行内的控件的值。

于 2013-06-13T08:09:07.693 回答