【问题标题】:asp.net custom Gridview which switch to edit mode only for clicked cellasp.net 自定义 Gridview 仅针对单击的单元格切换到编辑模式
【发布时间】:2015-02-05 05:16:38
【问题描述】:

我正在尝试创建自定义 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);  

    }

有人可以帮忙吗?

【问题讨论】:

    标签: asp.net gridview custom-controls


    【解决方案1】:

    默认情况下,Gridview 一次只允许您编辑一行。对于每一行来说,这是一个全有或全无的交易,当然前提是您的所有列都没有标记为ReadOnly

    其次,编辑事件本身是基于行而不是基于单元格的,因此要获得您想要的功能,您必须创建自己的更新例程,该例程遍历每行的每个单元格并相应地更新您的数据存储

    我想说,仅仅因为你可以做某事并不 必然意味着您应该。这是一个彻头彻尾的憎恶 一个应用非常广泛的控件。所以,也就是说,我们可以做到的事实 这是,IMO,对控制设计者的证明。

    在 Gridview 的设计器中,将所有可编辑字段转换为模板字段,并且不要添加任何选择/编辑/更新/删除/插入命令控件。这些是基于行的操作,您希望避免这种情况,尤其是编辑。您将不得不编写自己的例程 - 见上文

    然后切换到源视图(从这里开始下一部分会更容易)

    1. 删除&lt;ItemTemplate&gt;的内容
    2. &lt;EditItemTemplate&gt;s 的内容移动到&lt;ItemTemplate&gt;
    3. 删除所有&lt;EditItemTemplate&gt; - 此时不需要它们
    4. 将每个可编辑控件设为只读,即:&lt;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
    

    在一些&lt;script&gt; 标签或相关的.js 代码文件中是这样的:

    function EnableMe( elem ) {
      elem.readOnly= (! elem.readOnly);
    }
    

    最后,您必须在页面的某个位置放置一个保存按钮。如果您使用标准 Button 或 ImageButton 应该没问题。将CommandName 参数设置为合适的值,并在后面的代码中处理按钮的Command 事件。这是您执行自定义保存例程的地方。

    祝你好运。

    PS:关于您希望创建某个在单元格级别运行的 GridView 的派生版本,您想要的更像是电子表格或 DataGrid,而不是 asp:Gridview。您可能想找到一个更好的起点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      相关资源
      最近更新 更多