【问题标题】:Dynamically enable ASP.net button in GridView based on another control in the GridView基于 GridView 中的另一个控件动态启用 GridView 中的 ASP.net 按钮
【发布时间】:2010-09-01 11:59:17
【问题描述】:

我有一个带有复选框和下拉菜单的网格视图。

默认情况下,该复选框未选中。 默认情况下,下拉列表被禁用。

在 gridview 的编辑模式下,当用户单击复选框时,我希望下拉菜单启用。如果我能做这个客户端,那就太棒了,如果不能,我想在服务器端做,而不必点击更新然后再次编辑。

这是在 C# 中

谢谢!

我尝试了什么:

grdiview 是基于数据源的,所以最初我尝试将下拉列表的启用值基于复选框数据值的数据 Eval。但是,这需要选中该框,单击更新,然后编辑要启用的 ddl。然后我想也许自动回发会让所有用户不必点击更新然后再次编辑。这没有用。但是,我真正想要的是客户端解决方案。我认为它必须工作的方式是复选框上的事件必须实际启用下拉列表,我认为下拉列表不能监听要检查的复选框。但是我不知道如何在 asp 代码中从另一个控件引用控件。所以也许我会说像OnCheckChanged = if Checked then ddl.enabled = true? 这样的话,但我不知道该怎么写,而且我不知道我可以强制在客户端评估复选框的那个事件。

@Tim - 我试过了:

在rowdatabound事件中:

CheckBox chk = e.Row.FindControl("checkbox1") as CheckBox;
                DropDownList ddl = e.Row.FindControl("dropdownlist1") as DropDownList;
                chk.Attributes.Add("onclick", "document.getElementById('" + ddl.ClientID + "').enabled = this.checked;");

当我单击编辑时,此代码确实被命中,因此 onclick 事件被添加到复选框中。但是当我单击复选框时,下拉列表不会启用。

谢谢蒂姆!这是可行的解决方案。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)\
{
if ((row.RowType == DataControlRowType.DataRow) && ((row.RowState & DataControlRowState.Edit) > 0))
CheckBox chk = e.Row.FindControl("checkbox1") as CheckBox;
            DropDownList ddl = e.Row.FindControl("dropdownlist1") as DropDownList;
            chk.Attributes.Add("onclick", "document.getElementById('" + ddl.ClientID + "').disabled = !this.checked;");
}

【问题讨论】:

    标签: javascript asp.net gridview postback client-server


    【解决方案1】:

    使用RowDataBound 将客户端事件添加到您的复选框:

       GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
            Select Case e.Row.RowState
                Case DataControlRowState.Edit
                    Dim chk As CheckBox = DirectCast(e.Row.FindControl("MyCheckboxID"), CheckBox)
                    Dim ddl As DropDownList = DirectCast(e.Row.FindControl("MyDropdownlistID"), DropDownList)
                    chk.Attributes.Add("onclick", "document.getElementById('" & ddl.ClientID & "').disabled = ! this.checked;")
            End Select
        End Sub
    

    【讨论】:

    • @tim - 很酷。我会把它翻译成 C# 并尝试一下。虽然我也可以在 asp.net 代码中执行类似 onclick = document.getElementById("MyDropdownlistID.ClientID").enabled = this.checked;") 的操作吗?
    • @kralco626:可能是客户端 ID 尚未在 RowCreated-Event 中设置。但也许您可以改用 RowDataBound(认为此属性保存在 ViewState 中,不是吗?)。那里的 ClientID-Property 应该是最终的。
    • @Tim - 让我试试。我正要发帖说它不起作用,这可能就是原因
    • @Tim - 我用我尝试过的方法更新了我的问题。它不起作用。
    • @kralco:对不起,你没有提到我更新的答案。我改变了“... = this.checked;”进入“=!this.checked;”。重要的是感叹号是什么意思“不是”。选中复选框后,下拉菜单现在将被启用(而不是禁用)。
    【解决方案2】:

    到目前为止,您尝试过什么?这应该可以通过 TemplateField 和一点 javascript 轻松完成 http://msdn.microsoft.com/en-us/library/ms228046.aspx

    【讨论】:

    • 我更新了我的问题。抱歉,应该从一开始就包含该信息。
    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多