1

次の GridView があります。

        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="SysInvoiceID" DataSourceID="SqlDataSource1">
            <Columns>
                <asp:BoundField DataField="SysInvoiceID" HeaderText="SysInvoiceID" ReadOnly="True" SortExpression="SysInvoiceID" />
                <asp:BoundField DataField="BillMonth" HeaderText="BillMonth" SortExpression="BillMonth" />
                <asp:BoundField DataField="InvoiceDate" HeaderText="InvoiceDate" ReadOnly="True" SortExpression="InvoiceDate" />
                <asp:BoundField DataField="InvoiceNumber" HeaderText="InvoiceNumber" SortExpression="InvoiceNumber" />
                <asp:BoundField DataField="Net" HeaderText="Net" SortExpression="Net" />
                <asp:BoundField DataField="VAT" HeaderText="VAT" SortExpression="VAT" />
                <asp:BoundField DataField="Gross" HeaderText="Gross" SortExpression="Gross" />
                <asp:ButtonField CommandName="ViewInvoice"  HeaderText=" " ShowHeader="True" Text="View" />
            </Columns>
        </asp:GridView>

ページの背後にあるコードは次のとおりです。

public partial class PagingTest01 : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{

}

void GridView1_RowCommand(Object sender, GridViewCommandEventArgs e)
{
    // If multiple buttons are used in a GridView control, use the
    // CommandName property to determine which button was clicked.
    if (e.CommandName == "ViewInvoice")
    {
        // Convert the row index stored in the CommandArgument
        // property to an Integer.
        int index = Convert.ToInt32(e.CommandArgument);

        // Retrieve the row that contains the button clicked 
        // by the user from the Rows collection.
        GridViewRow row = GridView1.Rows[index];
        // Now you have access to the gridviewrow.

        ViewButton_Click(row);
    }
}




protected void ViewButton_Click(GridViewRow row)
{ 
    byte[] FileImage = GetImageData(0,row);

      if (FileImage != null)
      {
          base.Response.Clear();
          base.Response.Buffer = true;
          base.Response.ContentType = "Application/x-pdf";
          base.Response.ContentEncoding = Encoding.Default;
          string attachment = string.Format("attachment;filename=\"Invoice_{0}.pdf\"", "Customer1");
          base.Response.AddHeader("content-disposition", attachment);
          base.Response.BinaryWrite(FileImage);
          base.Response.Flush();
          base.Response.Close();
          base.Response.End();
      }
}





public byte[] GetImageData(int sysInvoiceID,  GridViewRow row)
    {

        string strUserID = CommonCode.GetCurrentUserID().ToString();
        string strCustomerID = CommonCode.GetCurrentCustomerID().ToString();
        byte[] numArray;

        string strConnectionString = "Data Source=TESTSERV;Initial Catalog=DB_Invoices;Persist Security Info=True";
        SqlConnection connection = new SqlConnection(strConnectionString);
        SqlCommand command = new SqlCommand("select FileImage from DB_Invoices.dbo.Bills WHERE (FileType = 'PDF' AND SysInvoiceID = @ID)", connection);
        command.Parameters.AddWithValue("@ID", GridView1.Rows[row].Cells[0].Text);

        SqlDataAdapter da = new SqlDataAdapter(command);
        DataSet ds = new DataSet();

        try
        {
            connection.Open();



            da.Fill(ds);
            DataRow item = ds.Tables[0].Rows[0];
            byte[] item1 = (byte[])item["FileImage"];
            ds.Tables.Clear();
            numArray = item1;


        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            connection.Close();
        }
        return numArray;
    }



}

したがって、基本的には、多くの行を持つ GridView があり、それぞれの横に「ビュー」ボタンフィールドがあります。「View」をクリックすると、GridView1_RowCommand を使用しようとしました。これは、ViewButton_Click に渡す前に、クリックされた行を取得する必要があることを願っています。次に GetImageData を呼び出し、行番号をこの行に渡します。

command.Parameters.AddWithValue("@ID", GridView1.Rows[row].Cells[0].Text);

セル 0 は SysInvoiceID 列であるため、正しい行が渡されると、@ID に SysInvoiceID が割り当てられます。

ただし、「Row」は有効な引数ではないようですが、理由はわかりません...明示的にintに変換する必要がない限り? どんな助けでも本当に感謝します! ありがとう。

4

2 に答える 2

2

私はこれを補足としてコメントしましたが、「理由はわかりませんが、有効な議論ではないようです...明示的にint" .

を使用する必要がある場合IDは、値から型を推測する必要があるため、データベースは間違った型を取得します。intint.Parse(celltext)AddWithValue

だから使用:

command.Parameters.AddWithValue("@ID", int.Parse(GridView1.Rows[row].Cells[0].Text));

それとは別に、イベント ハンドラーを追加していませんGridView1_RowCommand

<asp:GridView ID="GridView1" OnRowCommand="GridView1_RowCommand" runat="server" AutoGenerateColumns="False" DataKeyNames="SysInvoiceID" DataSourceID="SqlDataSource1">
   ....

CommandArgumentまた、行のインデックスに を設定していません。行インデックスが必要な場合は、とにかく別のアプローチを使用します。テンプレートフィールドとコントロールを使用します (例: Button. 次に、そのNamingContainerプロパティを使用して 'GridViewRow` への参照を取得します。例を次に示します。Asp.net Rowcommand イベントで行インデックスを取得する

于 2013-10-29T10:10:48.813 に答える