我的网格视图中有一个单独的列,并且我还添加了一个复选框/按钮。因此,当用户检查或单击复选框或按钮时,它应该更新我的 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();
}
}
}
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();
}
}
}
试试这个
我建议你简单地向 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 语法,但总体方法和概念是相同的。