我正在尝试创建自定义GridView服务器控件,因为我只想进入所选单元格的编辑模式。这是我的代码,但它不起作用
protected override void Render(HtmlTextWriter writer)
{
foreach (GridViewRow r in this.Rows)
{
if (r.RowType == DataControlRowType.DataRow)
{
for (int columnIndex = 0; columnIndex < r.Cells.Count; columnIndex++)
{
r.Cells[columnIndex].Attributes["onclick"] = Page.ClientScript.GetPostBackClientHyperlink(this, "Edit$" + r.Cells[columnIndex], true);
}
}
}
base.Render(writer);
}
任何人都可以帮助请。
默认情况下,Gridview仅允许您一次编辑一行。而且,假设您的所有列均未标记,则每一行都是全有或全无ReadOnly
。
其次,edit事件本身是基于行而不是基于单元的,因此要获得所需的功能,您将必须创建自己的更新例程,该例程在每一行的每个单元格中移动并相应地更新数据存储
我想说的是,仅仅因为您可以做某事并不一定意味着您应该做。这是非常广泛使用的控件的完全可憎。因此,IMO可以做到这一点,这证明了控制设计人员的正确性。
在Gridview的设计器中,将所有可编辑字段转换为模板字段,并且不要添加任何“选择/编辑/更新/删除/插入”命令控件。这些是基于行的操作,您要避免这种情况,尤其是“编辑”。您将必须编写自己的例程-参见上文
然后切换到“源代码”视图(从此处进行下一部分操作会更容易)
<ItemTemplate>
的<EditItemTemplate>
s的内容移至<ItemTemplate>
<EditItemTemplate>
的-在这一点上它们是不必要的<asp:TextBox ID="tbxWhatever" runat="server" Text='Bind("some_field_name")' ReadOnly="True"
现在,您在上方完成的操作是将“编辑”模式控件移至GridView的通常为ReadOnly的部分。随意更改或使用任何适合您目的的控件。
要获得所需的功能,您需要添加一个启用控件的js事件处理程序。我建议onclick
通过RowCreated
事件将处理程序添加到每个可编辑控件中,例如
<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的某些派生版本,您想要的更像是Spreadsheet或DataGrid,而不是asp:Gridview。您可能想找到一个更好的起点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句