我的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? 有没有人有任何想法让我尝试一下?
任何建议都表示赞赏!
答案 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 + "'";
}
}