在RowDataBound中设置OnClientClick后,事件未触发

时间:2010-01-19 11:08:00

标签: c# asp.net

我有一个Asp.net GridView(填充数据绑定)。 我的一个列是ButtonField(显然有自己的CommandName)。

GridView_RowCommand 完美无缺,但如果我添加 GridView_RowDataBound (我只是在其中添加javascript确认), GridView_RowCommand 事件不是在PostBack中解雇。

可能是什么问题/解决方案?

添加代码以便更好地理解:

Aspx代码:

<asp:GridView ID="GridView1" runat="server" 
    OnRowCommand="GridView1_RowCommand" 
    onrowdatabound="GridView1_RowDataBound">
    <Columns>
        <asp:BoundField DataField="MyField1" HeaderText="MyField1" />
        <asp:BoundField DataField="MyField2" HeaderText="MyField2" />
        <asp:ButtonField Text="MyAction" ButtonType="Image" ImageUrl="myaction.gif" CommandName="myaction" />
    </Columns>
</asp:GridView>

c#c​​ode:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        (e.Row.Cells[e.Row.Cells.Count - 1].Controls[0] as ImageButton).OnClientClick = "javascript:return confirm (\"Do action?\");";
    }
}

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "myaction")
    {
        DoMyAction();
    }
}

编辑:

我忘了告诉我的GridView在ajax TabContainer(AjaxControlToolkit)中

3 个答案:

答案 0 :(得分:5)

这是图像按钮正常发出的内容:

<input type="image" src="myaction.gif" alt="MyAction" onclick="javascript:__doPostBack('GridView1','myaction$1')" style="border-width:0px;" />

当你在代码隐藏中设置OnClientClick时,它会预先添加你的代码,但仍会添加__doPostBack函数调用,从而生成以下html:

<input type="image" src="myaction.gif" alt="MyAction" onclick="javascript:return confirm('Do action?');javascript:__doPostBack('GridView1','myaction$1')" style="border-width:0px;" />

onclick事件处理程序将在它有机会正确执行回发之前返回(它只会提交表单)。

这样做:

(e.Row.Cells[e.Row.Cells.Count - 1].Controls[0] as ImageButton).OnClientClick = "if (!confirm('Do action?')) { return false; }";

应允许客户端click事件运行__doPostBack函数,并在用户单击OK时按预期引发RowCommand事件服务器端。

(作为旁注,这是ASP.NET WebForms的一个缺点的一个很好的例子 - 有很多html被生成,你无法控制.ASP.NET MVC FTW!)< / p>

答案 1 :(得分:0)

乍一看,这似乎很好。您是否尝试在TabContainer之外运行代码?

它可能会让你朝着正确的方向前进。

答案 2 :(得分:0)

使用sender作为ClientScript.GetPostBackClientHyperlink函数的参数,这样它将创建客户端js事件。下面是RowDataBound中的示例,其中发件人是GridView(VB)。 YourCommand将作为要引发的RowCommand事件的参数传递。

e.Row.Cells(columnIndex).Attributes.Add("onclick", ClientScript.GetPostBackClientHyperlink(sender, "YourCommand$" & e.Row.DataItemIndex))