如果RowID链接到外键

时间:2015-10-22 14:25:41

标签: sql asp.net database vb.net gridview

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

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

table1 - “任务” PKY =“tsk_id”

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

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

3 个答案:

答案 0 :(得分:0)

如果您已经在DataSet中使用了表(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

答案 1 :(得分:0)

您绑定到网格的DataSource也应具有任务运行计数。然后,您可以使用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

答案 2 :(得分:0)

首先从Task_run表中获取task_Id,如果存在则返回零值,如果没有向用户显示,则将此Task_Id放在带有visible = false属性的Label或textbox或隐藏字段的gridview中, 使用此命令检查任务是否已由用户运行。

  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