1

ASP.NET (2.0) ドロップダウン リストの変更イベントが jQuery によって処理されるときに、jQuery を使用してメソッドをトリガーしようとしています。問題は、ドロップダウン リストが gridview 内にあり、ユーザーがその gridview 内の行を編集することを決定した場合にのみ配置されることです。

ASPコードブロックを使用してオブジェクトを取得したと思いますが、問題は、ページが最初にロードされたときに行の編集インデックスが存在せず、エラーがスローされることです。ステートメント内にブロックを配置してIFも機能しません。

$(document).ready(function() //when DOM is ready, run containing code
{
    <% if (grvTimeSheets.EditIndex > -1) {%>
        $(#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>).change(function() {
             $(#<%= grvTimeSheets.ClientID %>).block({ message: null }
        });
}
);
<% } %>

これは私が行った 1 つの試みであり、IF ステートメントの ASP コードを JavaScript ブロックの外側に配置することも試みました。それもうまくいきません。

jQuery イベントをドロップ ドロップ ボックスに適用するにはどうすればよいですか? できるだけ簡潔にするのが理想的です。


答えてくれてありがとう、いいえ、うまくいきません:(。JavaScriptコードが出力されていないようです...紛らわしい...

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //When DOM is ready, run the containing code
    {

    }
    );
</script>

出力です。これはコードですが:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.tablesorter.js"></script>
<script type="text/javascript" src="jquery.blockUI.js"></script>
<script type="text/javascript">
    $(document).ready(function() //when DOM is ready, run containing code
    {<% if (grvTimeSheets.EditIndex > -1) {%>
        var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
        $(id).change(function() {
             $(id).block({ message: null }
        });
     <% } %>
    }
    );
</script>

以前もそうしていたので、私はクレイジーになりました。


すみません、もう少しわかりやすくお願いします。コードビハインドで全体を次のように定義しようとしました:

DropDownList ddl (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    $(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
          csm.RegisterStartupScript(cstype, csname1, script, true);
}

そうですか?

ところで、上記は機能しませんでした。エラーはありません。イベントが機能しませんでした。

4

9 に答える 9

2

ここにいくつかのことがあります。

  1. セレクターを関数に渡すときは、セレクターを引用符で囲む必要があります$()。上記のコードスニペットは、のようなものを生成しますが$(#some-generated-id)、これは機能しません。
  2. ステートメントがonready関数の外にある場合、サーバー側の最後の中括弧。場合は、開口部と同じレベルでネストする必要があります。

これを試してください:

$(document).ready(function() //when DOM is ready, run containing code
{
  <% if (grvTimeSheets.EditIndex > -1) {%>
      var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>';
      $(id).change(function() { 
           $(id).block({ message: null }
        }); 
 <% } %>
}
);

それが機能しない場合は、先に進んで、生成されたjavascriptも貼り付けてください。

于 2008-11-07T14:54:19.560 に答える
1

コードビハインドで作成するスクリプトブロック内:

string script = @"<script type=text/javascript> var myControlId = '" + ddl.ClientId  "';") + "</script>"

この構文は検証していませんが、近いはずです。自分で構文を追加できgrvTimeSheets.ClientIDます。これが機能する場合は、JavaScript配列を構築し、ClientIdをそのように格納するように変更することをお勧めします。そうすれば、操作する必要のあるグローバルJavaScript変数は1つだけになります。

于 2008-11-07T17:31:52.893 に答える
1

もう1つのオプションは、探している要素に、その動作を説明するクラス名を付けることです。次に、jQueryコードが本当に明確になります。

$(function() {
    $("select.yourMarkerClass").change(....);
});

編集行がない場合、このコードは何もしません。セレクターに一致する要素がある場合は、新しい動作が追加されます。

于 2008-11-07T17:34:26.600 に答える
1

ページの他の場所で同じIDを使用していない場合は、jQueryの高度なセレクターの1つを使用してASP.NETのUniqueIDを阻止できます。

$('[id$=ddlClients]')

これは、全体ではなく、id文字列の最後にのみ一致します。コントロールが異なる行内に複数回存在する場合、これはすべてのインスタンスに一致することに注意してください。

その他の例については、セレクターを参照してください。

于 2008-11-07T17:34:30.080 に答える
1

Page.ClientScriptプロパティを使用してスクリプト ブロックを登録し、jQuery でアクセスする必要がある ID を含めました。

外部ファイル内の私の JavaScript の例を次に示します。

var myFancySelector = '#' + myControlId;
selectedValue = $(myFancySelector).val();

myControlId はコード ビハインドから定義され、ClientScriptBlock に登録されます。

于 2008-11-07T17:04:27.923 に答える
1

これを使って:

cs.RegisterClientScriptBlock(cstype, csname, cstext2.ToString(), False)

スクリプトタグを含めているため、スクリプトタグを作成しないのは誤りです。MSDN のドキュメントでは、フラグの説明が間違っています。

また、コントロールのクライアント ID を、 jQueryコードではなく、コード ビハインドとは別の変数に入れるだけです。

次に、代わりに id を含む変数を jQuery コードで使用します。

于 2008-11-07T17:13:05.863 に答える
0

週末の後でもっとやってみます。ただし、これはコードでした。

DropDownList ddl = (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients");
if (ddl != null)
{
    ClientScriptManager csm = Page.ClientScript;
    Type cstype = this.GetType();
    String csname1 = "PopupScript";

    string script = @"
    <script language='javascript' type='text/javascript'>
    jQuery(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>";
    csm.RegisterStartupScript(cstype, csname1, script, false);
于 2008-11-07T17:28:12.683 に答える
0

キーは何でもかまいませんが、一意である必要があります。

于 2008-11-07T17:24:13.563 に答える
0

各行にドロップダウンがあるためです。各ドロップダウンには一意の ClientId があるため、Ben が提案したことを実行し、最も簡単なソリューションであるクラス セレクターを使用することをお勧めします。

または、編集クリックで JavaScript 関数を作成し、編集中の行のドロップダウンの一意のクライアント ID を取得することもできます。

申し訳ありませんが、コードを詳しく読む必要がありました。

于 2008-11-07T18:03:18.400 に答える