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");
        }
    }

リストビューから値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");
        }
    }
}

hereなどのデータベース対応コントロールを使用する場合ListView、コントロールはデータ項目ごとに自動的に一意の ID で作成されます。((LinkButton)sender).Parentこれは、データ項目 (ListViewDataItem行を表す)によって参照されるページ内に、同じコントロール (この場合は「box1」など) を複数持つことができることを意味します。

ListViewDataItem.FindControl独自の子スコープ内の特定のサーバー ID のコントロールを検索し、クリックされているボタンの同じ行内のコントロールの値を取得できるようにします。

于 2013-06-13T08:09:07.693 に答える