如果 RowID 链接到外键,则隐藏 Gridview 中的删除按钮 [关闭]

Posted

技术标签:

【中文标题】如果 RowID 链接到外键,则隐藏 Gridview 中的删除按钮 [关闭]【英文标题】:Hide Delete Button in Gridview if RowID links to Foreign Key [closed] 【发布时间】:2015-10-22 14:25:40 【问题描述】:

VB.NET - 我发现了与此相关的其他问题,但没有一个专门针对我的情况。我只处理两个表——“task”和“task_run”。

我有一个 Gridview,其中的行列出了某些“任务”。它们来自“任务”表,每个任务都有一个“tsk_id”。我希望每个任务(行)都有一个删除按钮,并且如果该任务没有与“task_run”表中的该任务关联的运行,则只希望该行的删除按钮可见。 (即,如果该任务已经运行,我不希望用户能够删除它。)

table1 - “任务” PKY = "tsk_id"

table2 - “task_run” PKY = "run_id" FKY = "run_tsk_id"

我假设我需要在我的 gridview 中有一个模板字段,并根据运行表中是否有与该特定任务 ID 关联的行有条件地显示删除按钮,但我一直坚持如何执行此操作。希望这是有道理的。任何帮助表示赞赏。谢谢!

【问题讨论】:

【参考方案1】:

您首先从 Task_run 表中相应地获取 task_Id,如果存在则返回零值,然后将此 Task_Id 放置在标签或文本框或隐藏字段的 gridview 中,如果您不向用户显示,则具有 visible=false 属性, 使用此命令检查任务是否已由用户运行。

  SELECT        ext.* , ISNULL((SELECT top 1 run_tsk_id
 FROM task_run WHERE run_tsk_id = ext.tsk_id),0) AS CheckId
    FROM          task  ext 

然后使用gridview的RowDataBound事件有条件地隐藏或显示删除按钮,代码为。

  Protected Sub Grid_RowDataBound(sender As Object, e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim lblCheckId As Label = DirectCast(e.Row.FindControl("lblCheckId"),Label)
        Dim deleteButton As Button = DirectCast(e.Row.FindControl("btnDelete"), Button)
        If CInt(lblCheckId.Text) > 0 Then
            deleteButton.Visible = False
        Else
            deleteButton.Visible = True
        End If
    End If
End Sub

【讨论】:

感谢您的帮助!第一行代码(sql 语句)去哪里了?在单独的数据源中?再次感谢! 对不起,我不太清楚你的问题,请解释一下。 您可以直接在存储过程或sql命令中使用此sql语句,并从您填充gridview的页面的页面加载事件中调用它。如果您问其他问题,请明确询问,并分享您的代码哪里有问题, 对不起。事实上,我现在正在做这件事。你说 Task_id 需要在标签或文本框上进入 gridview 。我选择在 gridview 上放置一个标签来保存任务运行计数。我还使用了您提供的 vb 代码,它抛出了一个异常,说它不能将标签转换为整数。你知道这个的解决方案吗?我一定遗漏了一些明显的东西。谢谢! 首先评论这行'If CInt(lblCheckId.Text) > 0 Then ' deleteButton.Visible = False 然后再次执行以检查您的网格是否显示计数标签的值,确保您的计数标签不应该为空值,这就是它抛出异常的原因,【参考方案2】:

如果您的表已经在数据集中(ds 说),您可以通过添加关系

ds.Relations.Add(name, parentColumn, childColumn, createConstraints)

例如:

ds.Relations.Add(
    name, 
    ds.Tables("task").Columns("tsk_id"), 
    ds.Tables("task_run").Columns("run_tsk_id"), 
    True)

或者,您可以通过子查询添加“task_run_count”作为表任务的属性:

SELECT ..., 
  (SELECT COUNT(*) FROM task_run WHERE run_tsk_id = task.tsk_id) AS [task_run_count] 
FROM task

【讨论】:

【参考方案3】:

您绑定到网格的数据源也应该有任务运行计数。然后您可以使用 RowDataBound 事件来显示或隐藏按钮。

Protected Sub Grid_RowDataBound(sender As Object, e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim taskRunCount As Integer = Convert.ToInt16(e.Row.Cells(0).Text) ''The Cells[0] should be which ever column you have Task run count
        Dim deleteButton As Button = DirectCast(e.Row.FindControl("DeleteButton"), Button)
        If taskRunCount > 0 Then
            deleteButton.Visible = False
        Else
            deleteButton.Visible = True
        End If
    End If
End Sub

【讨论】:

以上是关于如果 RowID 链接到外键,则隐藏 Gridview 中的删除按钮 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

oracle用rowid去掉重复值

EF 4.1 Code First 添加到外键集合

EF6:导航属性外键到外键

SQL不允许将数据添加到外键中[重复]

JDBCTemplate + MySQL 主键到外键

Spring Controller - 将 JSON 属性映射到外键实体