单击复选框或按钮时更新数据库

问题描述 投票:0回答:2

我的网格视图中有一个单独的列,并且我还添加了一个复选框/按钮。因此,当用户检查或单击复选框或按钮时,它应该更新我的 Oracle 数据库。当用户选中该复选框时,它应该采用第二列中存在的发票值,并且基于该发票编号,我的数据库应该针对该特定发票行使用值 1 进行更新

我添加了这个功能。在这里我使用按钮 feature.checkbox 或按钮任何人都可以。这是我已经实现的:

protected void GridViewRemittance_RowCommand(object sender, GridViewCommandEventArgs e) {
  if (e.CommandName == "UpdateRow") {
    ClientScript.RegisterStartupScript(GetType(), "alert", "alert('" + e.CommandArgument + "');", true);
    string invoiceID = Convert.ToString(e.CommandArgument);
    UpdateDatabase(invoiceID);
  }
}

protected void UpdateDatabase(string i) {
  string invoiceNumber = i;
  using (OracleConnection Conn = new OracleConnection(strCon)) {
    using (OracleCommand cmd = new OracleCommand()) {
      Conn.Open(); cmd.Connection = Conn;
      cmd.CommandText = "Update ap_lineitem_staging SET selected_invoice = 1 where pre_invoice_num='" + invoiceNumber + "'";
      cmd.ExecuteNonQuery();
    }
  }
}
c# asp.net function button checkbox
2个回答
0
投票

protected void GridViewRemittance_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "UpdateRow")
    {
        ClientScript.RegisterStartupScript(GetType(), "alert", "alert('" + e.CommandArgument + "');", true);
        string invoiceID = Convert.ToString(e.CommandArgument);
        UpdateDatabase(invoiceID);
    }
}

protected void UpdateDatabase(string i)
{
    string invoiceNumber = i;
    string connectionString = "YOUR_ORACLE_CONNECTION_STRING_HERE";

    using (OracleConnection conn = new OracleConnection(connectionString))
    {
        conn.Open();
        using (OracleCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = "UPDATE ap_lineitem_staging SET selected_invoice = 1 WHERE pre_invoice_num = :invoiceNumber";

            // Add parameter to the query to avoid SQL injection
            cmd.Parameters.Add("invoiceNumber", OracleDbType.Varchar2).Value = invoiceNumber;

            cmd.ExecuteNonQuery();
        }
    }
}

试试这个


0
投票

我建议你简单地向 GridView 添加一个复选框控件。

因此,在本例中,我们要将酒店设置为“Active”。 (因此,我们假设数据库中有一个名为 Active 的列。

所以,这个 GridView 标记:

<asp:GridView ID="GVHotels" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ID" CssClass="table" 
    Width="45%">
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
        <asp:BoundField DataField="LastName" HeaderText="LastName" />
        <asp:BoundField DataField="City" HeaderText="City" />
        <asp:BoundField DataField="HotelName" HeaderText="HotelName" />
        <asp:BoundField DataField="Description" HeaderText="Description" />
        <asp:TemplateField HeaderText="Active" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>
                <asp:CheckBox ID="chkActive" runat="server"
                    Checked='<%# Eval("Active") %>'
                    />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

背后的代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadGrid();
    }

    void LoadGrid()
    {
        string strSQL = @"SELECT * FROM tblHotelsA
                        ORDER BY HotelName";
        GVHotels.DataSource = General.MyRst(strSQL);
        GVHotels.DataBind();
    }

我们现在有了这个:

所以,现在让我们为上面的复选框添加一个事件。

由于我们无法调出复选框的属性表(因为它嵌套在 GridView 内部),因此我们只需使用标记将事件添加到复选框即可。

所以,那么这个:

因此,我们现在有了该复选框的事件代码存根。

因此,复选框后面的代码就变成了这样:

    protected void chkActive_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox chkActive = (CheckBox)sender;
        GridViewRow gRow = (GridViewRow)chkActive.NamingContainer;

        int DataPK = (int)GVHotels.DataKeys[gRow.RowIndex]["ID"];

        SqlCommand cmdSQL = 
            new SqlCommand(@"UPDATE tblHotelsA SET Active = @Active
                             WHERE ID = @ID" );
        cmdSQL.Parameters.Add("@Active", SqlDbType.Bit).Value = chkActive.Checked;
        cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = DataPK;
        General.MyRstE(cmdSQL);

    }

为了完整起见,我将包含 2 个对应用程序全局的“帮助程序”例程。他们是:

    public static DataTable MyRst(string strSQL)
    {
        DataTable rstData = new DataTable();


        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                cmdSQL.Connection.Open();
                rstData.Load(cmdSQL.ExecuteReader());
            }
        }
        return rstData;
    }


    public static void MyRstE(SqlCommand cmdSQL)
    {

        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (cmdSQL)
            {
                cmdSQL.Connection = conn;
                conn.Open();
                cmdSQL.ExecuteNonQuery();
            }
        }
    }

在上面,我使用了 GridView 的 DataKeys[] 功能,因为它允许您使用数据库主键值,但不要求您在 GridView 中包含或显示数据库 PK 值。

您当然可以在上述 SQL 更新中使用发票号码,但在大多数情况下,如果可能的话,我建议使用 DataKeys 功能以及使用数据库主键进行更新。

在上面,我使用了 SQL Server 语法而不是 Oracle 语法,但总体方法和概念是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.