1

リストボックス内の各項目に対して動的に HiddenFields を作成している Web サイトがあります。

foreach (Checklist c in check)
{
    lbxCheckListLevel3.Items.Add(c.Name);
    HiddenField hf = new HiddenField();
    hf.ID = c.Name;
    hf.Value = c.Status + ":" + c.ResponseLabels + ":" + c.Prompt + ":" + c.Notes + ":" + c.ResponseValues;
    prompt.Controls.Add(hf);
}

HiddenField の値が Javascript 内で変更されています

そして、保存ボタンがクリックされると、OnClick 関数が実行され、すべての HiddenFields を調べて、Values を読み戻します。

for(int i = 0; lbxCheckListLevel3.Items.Count > i; i++)
{
   //Update the main checklist with the new information                
   HiddenField hidden = (HiddenField)FindControl(lbxCheckListLevel3.Items[i].Text);
   int index = check.FindIndex(delegate(Checklist c) { return c.Name == lbxCheckListLevel3.Items[i].Text; });
   if (check[index].Status != int.Parse(hidden.Value.Split(':')[0]) || 
      check[index].Notes != hidden.Value.Split(':')[3] ||
      check[index].ResponseValues != hidden.Value.Split(':')[4]) 
   {
      check[index].Status = int.Parse(hidden.Value.Split(':')[0]);
      check[index].Notes = hidden.Value.Split(':')[3];
      check[index].ResponseValues = hidden.Value.Split(':')[4];
      check[index].Changed = true;
   }
}

私の問題は、FindControl Line が NULL を返すことです。IE9 で開発者ツールを立ち上げ、それが存在し、正しい ID を持っていることを確認しました。しかし、それでもNULLを返します

さらに情報が必要な場合は、お問い合わせください。できる限りのことをいたします。

編集

次の行は犯人です。ダッシュのせいだと思います。フィールドのIDに表示されているのに

Environmental Health – Does the application involve any of the following:

Javascript は引き続きコントロールを見つけて値を変更できます。

ダッシュで別のものを見つけましたが、それはエラーなしで見つかりました。この線だけのようです...

4

1 に答える 1

1

他の人があなたに提案したものは有効であるだけでなく、コントロールがPage_InitまたはPage_Loadで再作成されていることを確認する必要があります。また、コントロールを に追加していることも考慮してください。prompt.Controlsたとえば、次のように検索してみてください。

HiddenField hidden = (HiddenField)prompt.FindControl(...);

この方法でのみ、以前に追加したコンテナと同じコンテナを確実に検索できますHiddenField

于 2012-05-04T00:23:01.423 に答える