2010-11-25 5 views
0

ここでは私はJavaScriptである:JavaScriptの何が問題なのですか? (C#/ ASP.NET)

<script type="text/javascript"> 
function onholdev(index) { 
    var chk = document.getElementById('<%=grdCons.Rows[' + index + '].FindControl("chkHold").ClientID %>'); 
    var txt = document.getElementById('<%=grdCons.Rows[' + index + '].FindControl("txtReason").ClientID %>'); 


    if (chk.checked == true) { 
     txt.disabled = false; 
    } 
    else { 
     txt.disabled = true; 
     txt.value = ""; 
    } 
} 
</script> 

'インデックス' 変数はそうのように、私のGridViewのRowDataBoundイベントから来ている:

CheckBox chkHold = ((CheckBox)e.Row.FindControl("chkHold")); 
    chkHold.Attributes.Add("onchange", "onholdev(" + e.Row.RowIndex + ")"); 

しかし、私は私の関数の最初の行(var chkで始まる)の '文字列リテラルにあまりにも多くの文字を取得する'。どうしてこれなの?

答えて

3

あなたはクライアントとサーバー側のスクリプトを混在させています...これはできません。

grdCons.Rows[' + index + '].FindControl("chkHold").ClientID 

しかし、あなたは、クライアント側、それを呼び出し、IDを渡すためにしようとしている、それはちょうどあなたが行うことができるものではありません、あなたのレンダリングされたJavaScript関数を見て、これはより明確になります。これが実行されるサーバ側であります。だけではなく、たとえば、あなたはあなたのコントロールその方法を見つけることができ、テーブルのIDを使用します。

var row = document.getElementById("grdCons").rows[index]; 
var inputs = row.getElementsByTagName("input"); 
//then filter by ID match, class, whatever's easiest and set what you need here 
+0

を - 彼は、出力にかなりの唯一の方法であるコントロールのクライアントIDをサーバ側を使用していますASP.Netが半無作為にそれらを生成するのでIdを得るために。生成されたjavascriptは 'var chk = document.getElementById( 'chk_0000001');'のようになります。あなたができる場合は、私はそれを試してすべてのサーバー側を維持する方が良いと同意しました – Basic

+0

@Basiclife - それは正しくない、関数を見て、 'index'は渡されるパラメータです、これはJavaScriptにサーバーにアクセスしようとします側のコレクション( '' grdCons.Rows')はインデックスではできません。 –

+0

Ah - コールでJSインデックスを使用していたことがわかりませんでした。ええ、それは決して働くつもりはありません:) – Basic

0

問題が' + index + 'で一重引用符の使用です。それらを二重のqoutesに変更すればうまくいくはずです。

+0

これは問題ではありません、私は構文的にはいを意味します。しかし、あなたが戻って、彼がやっていることを見て、これは本当にそれを解決しません:) –

+0

いいえ、それはしないでください。 * index *はjavascript関数内の変数です。これは決してうまくいかず、 'Rows []'は文字列 '' + index + ''ではなく整数を求めます。 –

+0

@David - これは**クライアント側の**関数JavaScriptであり、最初はこのようなサーバー側のコレクションにはアクセスできません。 –

1

これは、おそらくASP.NETがエラーをスローするためです。これは、クライアント側の呼び出しでgetElementByIdと書かれているためです。 onholdev関数はクライアント側で実行されるため、インデックスパラメータをサーバー側で実行されるASP.NETに渡すことはできません。これを試してみてください:

<script type="text/javascript"> 
function onholdev(checkbox, textbox) { 
    var chk = document.getElementById(checkbox); 
    var txt = document.getElementById(textbox); 

    if (chk.checked == true) { 
     txt.disabled = false; 
    } 
    else { 
     txt.disabled = true; 
     txt.value = ""; 
    } 
} 
</script> 

サーバーの交換 - これでサイドコード:厳密には正しくありません

CheckBox chkHold = ((CheckBox)e.Row.FindControl("chkHold")); 
chkHold.Attributes.Add("onchange", "onholdev('" + 
    e.Row.FindControl("chkHold").ClientID + "','" + 
    e.Row.FindControl("txtReason").ClientID + "')"); 
+0

+1 - 確かに別の実行可能な解決策...私は個人的に*邪魔にならないルートに行くだろうが、webformsでページはインラインスクリプトでとにかく散らばっている... –

+0

私は(一口)知っている、それを現在と一緒に。それは2つを混合して大きな時間を吸う... :) –

関連する問題