【问题标题】:Complex editing on a gridview in C#在 C# 中的 gridview 上进行复杂的编辑
【发布时间】:2011-04-25 13:59:52
【问题描述】:

我正在开发一个包含以下表格的考勤系统:

Entry
+---------+-----------+
+ EntryID + EntryDate +
+---------+ ----------+


Hour
+---------+--------+---------+
+ EntryID + InHour + OutHour +
+---------+--------+---------+

使用以下示例数据:

Entry
+---------+---------------------+
+ EntryID +     EntryDate       +
+---------+---------------------+
+   1     + 1/1/2010 8:00:00 AM +
+   2     + 1/1/2010 8:01:02 AM +
+---------+---------------------+

Hour
+---------+---------------------+-----------------------+
+ EntryID +        InHour       +        OutHour        +
+---------+---------------------+-----------------------+
+    1    + 1/1/2010 8:00:00 AM +  1/1/2010 1:00:00 PM  +
+    1    + 1/1/2010 2:04:00 PM +  1/1/2010 6:03:00 PM  +
+    2    + 1/1/2010 8:01:02 AM +  1/1/2010 1:02:00 PM  +
+---------+---------------------+-----------------------+

我有以下网格视图:

我需要关于如何处理我的客户今天完成的请求的帮助...

目前,当调用此网格视图时,“到达”和“离开”字段是通过查询数据库并将所有小时连接到一个字符串中然后打印出来来检索的。但是,我的客户现在希望能够修改“休假”列中的任何时间。我根本不知道如何处理这个请求,因为时间都集中在一个单元格中。我曾考虑在 textarea 中显示小时数,但如果我这样做,更改将无法正确应用于数据库。

任何帮助都将不胜感激,因为我对此感到不知所措。

提前致谢, 伊顿B.

【问题讨论】:

    标签: c# asp.net sql-server sql-server-2005 gridview


    【解决方案1】:

    正如 Aristos 所讨论的,一种方法是允许以更加 Ajaxy 的方式进行更新。这通常被认为是一种对用户更友好的方法,并且肯定会提供更好的用户体验,但需要熟悉 jQuery 和 JavaScript,并且从您的角度来看,客户端和服务器之间的交互要复杂一些。

    如果您想继续使用 Web 控件范例,请考虑将“到达”和“离开”字段设为 TemplateFields。在 ItemTemplate 中,您可以继续显示在数据库中连接的文本,但您会在 EditItemTemplate 中放置一个 GridView。此 GridView 可以绑定到数据源控件(也在 EditItemTemplate 中)并配置为支持编辑。如果您以编程方式绑定数据(即,您使用数据源控件),那么只要父行变为可编辑,您就需要将数据绑定到子 GridView。这可以使用如下标记以声明方式完成:

    <asp:TemplateField ...>
        <EditItemTemplate>
            <asp:GridView runat="server" id="gvChild" DataSource='<%# SomeFunction() %>' ...>
               ...
            </asp:GridView>
        </EditItemTemplate>
    </asp:TemplateField>
    

    这里,SomeFunction 将是代码隐藏类中的一个函数(通常),它返回要绑定到网格的数据。

    或者,您可以通过父 GridView 的 RowDataBound 事件处理程序以编程方式将数据绑定到子 GridView。即,您将检查您是否正在处理正在编辑的行(即,如果是e.Row.RowIndex = ParentGridViewID.EditIndex)。如果是这样,您可以使用e.Row.FindControl("ChildGridViewID") 以编程方式引用子GridView,然后设置其DataSource 属性并调用其DataBind 方法。

    当用户单击父网格的“编辑”按钮时,“到达”和“离开”单元格将显示为带有自己的编辑按钮的网格,以修改各个时间。或者,如果您想让用户编辑“到达”和“离开”时间而不要求用户首先选择编辑父记录,您可以将子可编辑 GridView 放在 ItemTemplate 中。

    【讨论】:

    • 我想尝试一下“gridview inside gridview”的方法。我开始使用它,但是当我单击父网格的编辑按钮时,没有显示 Leaves At 中的子网格(应该是一列文本框)。这是因为我还没有设置数据源吗?
    • @Elton:是的,当 GridView 进入编辑模式时,您需要将数据绑定到它。这可以通过数据绑定以声明方式设置 GridView 的 DataSource 属性(例如 DataSource='')或在绑定正在编辑的行时通过 RowDataBound 事件处理程序以编程方式进行。跨度>
    • @Elton:我编辑了我的答案以将答案合并到您的评论/问题中。谢谢
    【解决方案2】:

    这是我做类似的方式。

    <span id="HourID_445" onclick="EditMe(this);">17:42:51</span>
    

    现在,当您单击此时间时,您会使用 jQuery 打开一个 iframe 对话框,并发送您单击的跨度的 ID,并包含您需要编辑的时间的 ID。所以你有了 ID,你在 iframe 中有一个简单的 .aspx 对话框,你进行编辑,按 OK,保存它,然后在保存后你还将 span 更新回表格。

    这里的关键是将小时的 ID 隐藏在 span 元素中,然后使用 Javascript 获取它。

    如果我不是很清楚,请向我询问更多信息。

    没有jQuery

    ​​>

    有滑坡:http://highslide.com/

    见这个例子http://highslide.com/examples/iframe.html

    您可以使用 hislide,并且您只需在每次 Time 上制作这条简单的线。

    <a href="EditTime.aspx?TimeID=23" 
        onclick="return hs.htmlExpand(this,{objectType:'iframe'} )">23:00:00</a>
    

    【讨论】:

      【解决方案3】:

      遗憾的是,我认为这是当前架构无法让这种改变变得容易的请求之一。事件最简单的请求可以揭示设计时的疏忽。

      如果您的客户真的想要这些更改,也许是时候告诉他们这并不简单。

      附:说真的,我感受到了你的痛苦。

      【讨论】:

      • 相信我,当你这样做的时候很简单 :) (这不是答案,它是评论)
      猜你喜欢
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多