默认情况下,Gridview 一次只允许您编辑一行。对于每一行来说,这是一个全有或全无的交易,当然前提是您的所有列都没有标记为ReadOnly。
其次,编辑事件本身是基于行而不是基于单元格的,因此要获得您想要的功能,您必须创建自己的更新例程,该例程遍历每行的每个单元格并相应地更新您的数据存储
我想说,仅仅因为你可以做某事并不
必然意味着您应该。这是一个彻头彻尾的憎恶
一个应用非常广泛的控件。所以,也就是说,我们可以做到的事实
这是,IMO,对控制设计者的证明。
在 Gridview 的设计器中,将所有可编辑字段转换为模板字段,并且不要添加任何选择/编辑/更新/删除/插入命令控件。这些是基于行的操作,您希望避免这种情况,尤其是编辑。您将不得不编写自己的例程 - 见上文
然后切换到源视图(从这里开始下一部分会更容易)
- 删除
<ItemTemplate>的内容
- 将
<EditItemTemplate>s 的内容移动到<ItemTemplate>
- 删除所有
<EditItemTemplate> - 此时不需要它们
- 将每个可编辑控件设为只读,即:
<asp:TextBox ID="tbxWhatever" runat="server" Text='Bind("some_field_name")' ReadOnly="True"
现在您在上面所做的是将编辑模式控件移动到通常是 GridView 的 ReadOnly 部分。随意更改或使用适合您目的的任何控件。
要获得您想要的功能,您需要添加一个启用控件的 js 事件处理程序。我建议通过RowCreated 事件为每个可编辑控件添加一个onclick 处理程序,类似于
<asp:TextBox ID="tbxWhatever" runat="server" Text='Bind("some_field_name")'
Enabled="False"
onclick="EnableMe(this)"
代码背后(VB):
Private Sub Gridview1_RowCreated(sender As Object, e As GridViewRowEventArgs) Handles Gridview1.RowCreated
dim gv as GridView = sender
dim tbx as TextBox = gv.FindControl("tbxWhatever")
tbx.Attributes.Add("onclick", "EnableMe(this);")
End Sub
在一些<script> 标签或相关的.js 代码文件中是这样的:
function EnableMe( elem ) {
elem.readOnly= (! elem.readOnly);
}
最后,您必须在页面的某个位置放置一个保存按钮。如果您使用标准 Button 或 ImageButton 应该没问题。将CommandName 参数设置为合适的值,并在后面的代码中处理按钮的Command 事件。这是您执行自定义保存例程的地方。
祝你好运。
PS:关于您希望创建某个在单元格级别运行的 GridView 的派生版本,您想要的更像是电子表格或 DataGrid,而不是 asp:Gridview。您可能想找到一个更好的起点。