CommandArgument 绑定多个 参数

本文介绍了一种在ASP.NET中使用LinkButton的方法,并展示了如何设置其属性以实现特定的功能。通过具体示例代码,读者可以了解到如何为LinkButton设置CommandName、CommandArgument和Text等属性。

<asp:LinkButton ID="LinkButton1" runat="server" CommandName="cgys" CommandArgument='<%# Eval("RN_ID")+","+Eval("v")%>' Text='<%# Eval("RN_ID") %>'>
   </asp:LinkButton>

转载于:https://www.cnblogs.com/ok519/archive/2009/07/01/1514743.html

前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="listview增删改查._default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <style type="text/css"> .divItem { padding: 5px; } .divBtns { width:130px; } .divInfo { width:350px; padding:0px 10px 0px 10px; border-left:1px solid #dadada; border-right:1px solid #dadada; } .divInfo2 { width:200px; } .divBtns, .divInfo, .divInfo2 { float:left; } .clr { clear:both; } </style> </head> <body> <form id="form1" runat="server"> <div> <asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource2" ItemPlaceholderID="itemholder"> <LayoutTemplate> <div runat="server" id="itemholder"></div> </LayoutTemplate> <ItemTemplate> <div id="divItem"> <div class="divBtns"> <asp:Button ID="btn_edit" runat="server" Text="编辑" CommandName="edit" /><br/> <asp:Button ID="btn_delete" runat="server" Text="删除" CommandName="delete" /> <asp:Button ID="btn_delmak" runat="server" Text="标记删除" CommandName="lvcmd" CommandArgument='<%#Eval("se_id") %>' onCommand="mycmd" /> </div> <div class="divInfo"> <h2><%#Eval("se_name") %></h2> <p><%#Eval("se_memo") %></p> </div> <div class="divInfo2"> <asp:CheckBox ID="chk_enable" runat="server" Checked='<%#Eval("se_enable") %>' Enabled="false" Text="有效性" /><br/> <p>排序:<%#Eval("se_order") %></p> </div> <div class="clr"></div> </div> </ItemTemplate> </asp:ListView> <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString9 %>" DeleteCommand="DELETE FROM [T_SERIES] WHERE [se_id] = ?" InsertCommand="INSERT INTO [T_SERIES] ([se_id], [se_name], [se_memo], [se_order], [se_enable], [se_delete]) VALUES (?, ?, ?, ?, ?, ?)" ProviderName="<%$ ConnectionStrings:ConnectionString9.ProviderName %>" SelectCommand="SELECT * FROM [T_SERIES] WHERE SE_DELETE=FALSE" UpdateCommand="UPDATE [T_SERIES] SET [se_name] = ?, [se_memo] = ?, [se_order] = ?, [se_enable] = ?, [se_delete] = ? WHERE [se_id] = ?"> <DeleteParameters> <asp:Parameter Name="se_id" Type="Int32" /> </DeleteParameters> <InsertParameters> <asp:Parameter Name="se_id" Type="Int32" /> <asp:Parameter Name="se_name" Type="String" /> <asp:Parameter Name="se_memo" Type="String" /> <asp:Parameter Name="se_order" Type="Int32" /> <asp:Parameter Name="se_enable" Type="Boolean" /> <asp:Parameter Name="se_delete" Type="Boolean" /> </InsertParameters> <UpdateParameters> <asp:Parameter Name="se_name" Type="String" /> <asp:Parameter Name="se_memo" Type="String" /> <asp:Parameter Name="se_order" Type="Int32" /> <asp:Parameter Name="se_enable" Type="Boolean" /> <asp:Parameter Name="se_delete" Type="Boolean" /> <asp:Parameter Name="se_id" Type="Int32" /> </UpdateParameters> </asp:SqlDataSource> </div> </form> </body> </html> 后端代码: using System; using System.Collections.Generic; using System.Data.OleDb; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace listview增删改查 { public partial class _default : System.Web.UI.Page { string str_cnn = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source="; string str_sourcefile = "mdb\\TB-HLINKS.accdb"; OleDbConnection cnn; OleDbCommand cmd; OleDbDataReader datar; string str_sql; protected void Page_Load(object sender, EventArgs e) { } protected void mycmd(object sender, CommandEventArgs e) { string str_conn = str_cnn + MapPath(str_sourcefile); cnn = new OleDbConnection(str_conn); cnn.Open(); str_sql = "update T_SERIES set se_delete =true where " + "se_id =" + e.CommandArgument.ToString(); cmd = new OleDbCommand(str_sql, cnn); cmd.ExecuteNonQuery(); cnn.Close(); ListView1.DataBind(); } } } 不能更改数据,什么原因呢?
08-15
<think>我们正在处理一个ASP.NET ListView控件中Command命令无法更新数据库字段se_delete的问题。 根据用户提供的代码片段:str_sql = "update T_SERIES set se_delete =true where se_id =" + e.CommandArgument.ToString(); 我们之前已经指出该SQL语句存在语法错误(Access中布尔应写为True)和安全问题(应使用参数化查询)。 现在,用户的问题可能是:即使修改了SQL语句,更新操作仍然没有成功。我们需要从多个方面排查。 排查步骤: 1. **检查SQL语句是否正确执行**: - 确保在代码中使用了正确的SQL语句(使用True而不是true,并采用参数化查询)。 - 检查数据库连接字符串是否正确,是否有写入权限。 2. **检查ListView的Command事件绑定**: - 确保ListView的ItemCommand事件已经绑定到事件处理方法。 3. **检查CommandArgument的设置**: - 在ListView的模板中,按钮(如LinkButton或Button)的CommandArgument是否正确设置为要更新的记录的ID。 4. **检查事件处理程序**: - 在ItemCommand事件处理程序中,是否正确地获取了CommandArgument,并执行了更新操作。 5. **检查页面生命周期和回发**: - 确保更新操作发生在每次回发时,且数据绑定没有覆盖更新后的状态。 6. **错误处理**: - 添加错误处理,查看是否有异常被抛出。 7. **前端控件干扰**: - 参考引用[2]:如果ListView的Item中包含一些可获取焦点的子控件(如CheckBox、Button等),可能会导致ItemCommand事件无法触发。需要给这些子控件设置属性:`focusable="false"`。 具体步骤: 步骤1:修正SQL语句并使用参数化查询(以Access为例) 修正后的代码示例(在ItemCommand事件处理程序中): ```csharp protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e) { if (e.CommandName == "Delete") // 假设按钮的CommandName为"Delete" { string connectionString = ConfigurationManager.ConnectionStrings["YourConnectionString"].ConnectionString; using (OleDbConnection conn = new OleDbConnection(connectionString)) { string sql = "UPDATE T_SERIES SET se_delete = True WHERE se_id = ?"; OleDbCommand cmd = new OleDbCommand(sql, conn); // 注意:如果se_id是文本类型,则不需要改变;如果是数字类型,则转换为数字 cmd.Parameters.AddWithValue("se_id", e.CommandArgument.ToString()); conn.Open(); cmd.ExecuteNonQuery(); } // 更新后重新绑定数据 BindListView(); } } ``` 步骤2:检查ListView的ItemCommand事件绑定 在ASPX页面中,确保ListView的OnItemCommand事件属性设置为上述事件处理程序: ```aspnet <asp:ListView ID="ListView1" runat="server" OnItemCommand="ListView1_ItemCommand"> <!-- 布局模板和项模板 --> </asp:ListView> ``` 步骤3:检查按钮的CommandArgument设置 在ListView的ItemTemplate中,按钮应该设置CommandArgument为当前项的ID(例如绑定字段se_id): ```aspnet <ItemTemplate> <!-- 其他内容 --> <asp:LinkButton ID="lnkDelete" runat="server" CommandName="Delete" CommandArgument='<%# Eval("se_id") %>' Text="标记删除" /> </ItemTemplate> ``` 步骤4:检查页面数据绑定 确保在Page_Load中,只有第一次加载页面时才绑定数据,回发时不要重新绑定(除非更新后需要刷新): ```csharp protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindListView(); } } ``` 步骤5:添加错误处理 在更新数据库的代码块中加入try-catch,以便捕获并记录异常: ```csharp try { using (OleDbConnection conn = new OleDbConnection(connectionString)) { // ... 执行更新 } } catch (Exception ex) { // 记录异常信息,可以使用Label显示或记录到日志 Label1.Text = "更新失败: " + ex.Message; } ``` 步骤6:检查前端子控件干扰 如果在ListView的项模板中,除了触发Command的按钮外,还有其他可能获取焦点的控件(如CheckBox、Button等),请确保它们不会阻止事件冒泡。可以尝试设置这些控件的属性: ```aspnet <asp:CheckBox ID="chkOption" runat="server" focusable="false" /> <!-- 或者使用属性:Focusable="false"(在服务器控件上可能不直接支持,可以尝试用CSS或属性转换) --> ``` 但是,在ASP.NET Web Forms中,我们通常通过设置`OnClientClick`来阻止事件冒泡,或者确保子控件的事件处理不会阻止父容器的事件。另外,ListView的ItemCommand事件是由实现了IButtonControl的控件触发的(如Button、LinkButton),只要点击这些按钮,就会触发ItemCommand。如果按钮被禁用或者被其他元素覆盖,则可能无法触发。 步骤7:检查更新后的数据绑定 更新操作后,重新绑定ListView(如步骤1中的BindListView()方法),这样用户就能立即看到更新后的状态(例如,可以在标记删除的行上应用不同的样式)。 如果以上步骤都检查无误,仍然无法更新,请考虑: 1. 查看数据库中的记录是否真的被更新(直接打开数据库查看)。 2. 在更新语句执行后,检查ExecuteNonQuery()的返回(应该是1,表示更新了一行),如果为0,说明没有找到匹配的记录,可能是se_id不对。 3. 使用调试工具,在更新语句执行前检查e.CommandArgument是否正确。 示例:在更新前输出e.CommandArgument ```csharp protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e) { System.Diagnostics.Debug.WriteLine("CommandArgument: " + e.CommandArgument.ToString()); // ... 更新操作 } ``` 通过以上步骤,应该可以定位问题所在。 相关问题: 1. 如何为ASP.NET ListView添加删除确认功能? 2. 在Access数据库中,如何同时更新多个字段? 3. 如何防止ASP.NET ListView中的数据绑定覆盖用户输入? 4. 如何为ListView的删除操作添加事务支持?</think>针对 ASP.NET ListView 中 Command 命令无法更新数据库字段 `se_delete` 的问题,以下是系统性排查指南: ### 一、前端 ListView 配置排查 1. **CommandArgument 绑定验证** 确保按钮正确绑定数据字段: ```aspnet <asp:LinkButton runat="server" CommandName="MarkDelete" CommandArgument='<%# Eval("se_id") %>' Text="标记删除" /> ``` - ✅ 检查 `Eval("se_id")` 字段名是否与数据源一致 - ❌ 避免在按钮内嵌套可聚焦控件(如 CheckBox),需添加: ```aspnet <asp:CheckBox runat="server" focusable="false" clickable="false" /> ``` [引用参考:Android 类似场景解决方案^2] 2. **事件冒泡阻断测试** 在客户端添加事件阻断: ```javascript function stopPropagation(e) { e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation(); } ``` ```aspnet <asp:LinkButton OnClientClick="stopPropagation(event);" ... /> ``` ### 二、后端 C# 代码层排查 1. **事件处理程序绑定** 确认 ListView 已挂接事件: ```aspnet <asp:ListView OnItemCommand="ListView1_ItemCommand" ...> ``` 2. **参数化查询实现** 修正 SQL 并添加参数化(Access 专用): ```csharp protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e) { if (e.CommandName == "MarkDelete") { using (OleDbConnection conn = new OleDbConnection(connStr)) { string sql = "UPDATE T_SERIES SET se_delete = True WHERE se_id = ?"; OleDbCommand cmd = new OleDbCommand(sql, conn); cmd.Parameters.AddWithValue("@se_id", e.CommandArgument); conn.Open(); int affected = cmd.ExecuteNonQuery(); Debug.WriteLine($"更新记录数: {affected}"); // 调试输出 } BindListView(); // 重新绑定数据 } } ``` - ✅ Access 布尔必须用 `True`(非 true) - ✅ 参数化防止 SQL 注入 3. **数据类型验证** 添加类型检查: ```csharp if (int.TryParse(e.CommandArgument.ToString(), out int se_id)) { cmd.Parameters.Add("@se_id", OleDbType.Integer).Value = se_id; } else { throw new Exception("ID 格式错误"); } ``` ### 三、数据库层排查 1. **字段状态检查** 执行诊断查询: ```sql SELECT TOP 1 se_id, se_delete FROM T_SERIES WHERE se_id = [当前测试ID] ``` - 确认 `se_delete` 字段类型为 `Yes/No`(布尔型) - 检查字段是否只读 2. **权限验证** 在 Access 中: - 检查 .accdb 文件属性取消只读 - 验证应用程序池身份(IIS)或用户(本地调试)有写权限 ### 四、调试关键点 1. **断点设置位置**: - `ListView1_ItemCommand` 入口 - `ExecuteNonQuery()` 执行后 - `BindListView()` 重绑前 2. **日志输出**: ```csharp protected override void OnError(EventArgs e) { var ex = Server.GetLastError(); File.WriteAllText(Server.MapPath("~/error.log"), $"{DateTime.Now}: {ex.ToString()}"); } ``` ### 五、常见错误场景 | 错误现象 | 可能原因 | 解决方案 | |---------|---------|---------| | 点击无反应 | 前端事件阻断 | 检查嵌套控件 focusable 属性[^2] | | 更新后界面未刷新 | 未重新绑定数据 | 执行 `ListView.DataBind()` | | 报“操作必须使用可更新的查询” | Access 权限问题 | 赋予 NETWORK SERVICE 写权限 | | 布尔更新失败 | SQL 语法错误 | 使用 `True` 而非 `true` | ### 六、补充优化建议 1. 添加操作确认: ```aspnet <asp:LinkButton OnClientClick="return confirm('确定标记删除?');" ... /> ``` 2. 更新后视觉反馈: ```csharp if (affected > 0) { ClientScript.RegisterStartupScript(this.GetType(), "toast", "alert('更新成功');", true); } ``` --- **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值