2

我的 GridView 控件的一列中有 2 个按钮。

<asp:TemplateField ItemStyle-CssClass="minPadding">
    <ItemTemplate>
        <input  id="btnDateRange" type="button" value="Date Range" class="JQDatePicker SmallText FloatRight WrapButtonText" onclick="javascript:document.getElementById('hdnImpressionTagID').value = '<%# Eval("ImpressionTagID") %>'"/>
        <asp:Button ID="btnShowImpressions" CommandArgument='<%# Eval("ImpressionTagID") %>' CommandName="ShowImpressions" Text="Total Impressions" runat="server" UseSubmitBehavior="false" CssClass="SmallText FloatLeft WrapButtonText" Width="80px" />
    </ItemTemplate>
</asp:TemplateField>

第一个按钮是 HTML 控件的原因是因为当我尝试使用 asp:button 时 - onclick 事件不起作用(请注意 javascript 调用中的 #Eval 语句)使用服务器控件会给我错误:'服务器标签格式不正确'

我想从后面的代码中更改这些按钮的文本。(我正在使用 C#)

我找到了正确的行索引,我知道它们在单元格 5 中。

我可以像这样设置 asp:Button 控件的文本...

Button btn = ((Button)gridImpressionTags.Rows[i].Cells[5].FindControl("btnDateRange")); btn.Text = "This Text has changed!";

问题是:当从后面的代码中引用时,Web 控件btnDateRange显示为一个DataBoundLiteralControl,我无法将其转换为按钮。

我也无法将其转换为文字。Unable to cast object of type 'System.Web.UI.DataBoundLiteralControl' to type 'System.Web.UI.WebControls.Literal'.

并将其转换为 DataBoundLiteralControl 有效,但不允许我更改文本: System.Web.UI.DataBoundLiteralControl.Text' cannot be assigned to -- it is read only

有谁知道为什么我的 HTML 按钮被呈现为 DataBoundLiteralControl ?有没有人有任何想法让我为我尝试?

任何建议表示赞赏!

4

2 回答 2

3

1) 您可以将按钮带回 asp:button 并使用 OnClientClick 而不是 OnClick。在这种情况下,OnClick 用于服务器事件处理而不是 javascript。要使用 javascript,请使用 OnClientClick

2) 将 runat="server" 添加到您的 html 按钮

更新:我专注于从代码隐藏访问控件。试试这个 javascript

<input type="button" onclick='<%# String.Format("javascript:document.getElementById('hdnImpressionTagID').value = '{0}'", Eval("ImpressionTagID")) %>' />

更新

我同意你的观点,这并不容易。您可以将分配 onclick 移动到代码隐藏并处理不匹配的引号

1)<asp:Button runat="server ID="btnDateRange" Text="Date Range" />

2)在rowdatabound中分配onclick

protected void GridView_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
      Button btnDateRange = e.Row.FindControl("btnDateRange") As Button; //if you used Asp:Button
      btnDateRange.Attributes["onclick"] = "javascript:document.getElementById('hdnImpressionTagID').value = '"+e.Row.DataItem("ImpressionTagID")+"'";
}
于 2012-12-10T14:08:41.753 回答
2

首先 - 如果没有 codingBiz 的帮助,我无法回答这个问题,所以谢谢老兄!

诀窍是<input type="button">放弃类型按钮并使用服务器控件,它在 RowDataBound 上添加 onclick 事件。

我第一次不能这样做的原因是因为我需要向 onclick 事件添加一些 javascript,虽然这适用于标准 HTML 按钮控件,但它不适用于 asp:button。CodingBiz 指出我要在 RowDataBound 处添加 onclick 事件。通过一些代码更改以能够访问正确的行和数据键数据,我得到了它的工作......

ASPX 页面:

<asp:TemplateField>
    <ItemTemplate>
        <asp:Button runat="server" ID="btnDateRange" Text="asp Date Range" CssClass="JQDatePicker SmallText FloatRight WrapButtonText" />
        <asp:Button ID="btnShowImpressions" CommandArgument='<%# Eval("ImpressionTagID") %>' CommandName="ShowImpressions" Text="Total Impressions" runat="server" UseSubmitBehavior="false" CssClass="SmallText FloatLeft WrapButtonText" Width="80px" />
    </ItemTemplate>
</asp:TemplateField>

后面的代码:

        protected void gridImpressionTags_OnRowDataBound(object sender, GridViewRowEventArgs e)
    {
        Button btnDateRange = e.Row.FindControl("btnDateRange") as Button;

         if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Button btn = e.Row.Cells[5].Controls[1] as Button;
            string datakey = gridImpressionTags.DataKeys[e.Row.RowIndex].Value.ToString();

             btn.Attributes["onclick"] = "javascript:document.getElementById('hdnImpressionTagID').value = '" + datakey + "'";
         }
    }
于 2012-12-10T16:50:39.350 回答