更改GridView中的按钮文本 - (呈现为DataBoundLiteralControl的GridView ItemTemplate按钮)

时间:2012-12-10 14:04:26

标签: c# gridview eval htmlcontrols

我的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:按钮时 - 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? 有没有人有任何想法让我尝试一下?

任何建议都表示赞赏!

2 个答案:

答案 0 :(得分:3)

1)您可以将按钮返回到asp:按钮并使用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")+"'";
}

答案 1 :(得分:2)

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

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

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

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 + "'";
         }
    }