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!";

btnDateRange問題は次のとおりです。コード ビハインドから参照されたDataBoundLiteralControlときにWeb コントロールが として表示され、ボタンとしてキャストできません。

また、リテラルとしてキャストすることもできません。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 に戻し、OnClick の代わりに OnClientClick を使用できます。このコンテキストでは、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) 行データバインドで 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 に答える