1

フォームと 2 つのパネル (Panel1 と Panel2) を含むページから始めます。Panel2 は、ユーザーが Panel1 で入力したサーバー ホスト名のリストに基づいて、コントロールを動的に生成しました。Panel1 で「送信」を押すと、Panel1 の可視性が false に設定され、Panel2 の可視性が true に設定されます。ユーザーがすべてのフィールドに入力して Panel2 の「Submit2」ボタンを押した後、これらのコントロールから情報を取得して処理したいと考えています。ただし、FindControl("symptoms_" + i.ToString())(各コントロール名に応じて、これらの行に沿ったもの)を使用しますが、null を返しています。

コントロールが生成される前に、私が始めたフォームは次のとおりです。

<form id="btil_form" runat="server">
    <div>
    <asp:Panel ID="Panel2" runat="server" Visible="False">
        <asp:Button ID="Submit2" runat="server" Text="Submit" OnClick="Submit2_Click" />
        <br />
        <asp:Literal ID="result" runat="server"></asp:Literal>
        <br />
    </asp:Panel>
</form>

次に、コントロールが生成された後、ページ ソースは各コントロールの正しい ID 値を示します。

<div id="Panel2">

    <input type="submit" name="Submit2" value="Submit" id="Submit2" />
    <br />

    Hostname: g1x5554<br />Issue Reported:
    <select name="issue_1" id="issue_1">
        <option value="blank"></option>
        <!-- snip -->
        <option value="VC Profile Issue">VC Profile Issue</option>
    </select>

<br />
Symptoms: <textarea name="symptoms_1" rows="2" cols="20" id="symptoms_1"></textarea>
<br />
Problem Notes: <textarea name="notes_1" rows="2" cols="20" id="notes_1"></textarea>

***** snip *****

</div>

これらのコントロールを追加するために使用されるコードのサンプルを次に示します。症状リストは、追加するテキストボックスを含むテキストボックスです。

Panel2.Controls.Add(new Literal() { Text = "Symptoms: " });
Panel2.Controls.Add(symptomsList[litList.IndexOf(singleItem)]);

次に、各ホストに関連付けられたコントロールをループします。これらのコントロールはそれぞれ同じ ID を持っているため、コントロール「症状」と「メモ」の場合、各フィールドの ID は、最初のホストの場合は「症状 1」と「メモ 1」、2 番目のホストの場合は「症状 2」と「メモ 2」になります。 、 等々。ループ内で、次のようにコントロール値を取得しようとします。

TextBox thisTB = new TextBox();
thisTB = (TextBox)Panel2.FindControl("symptoms_" + i.ToString());
thisBTIL.symptoms = thisTB.Text;

ただし、明らかに FindControl は明らかに null を返し、null を TextBox としてキャストしようとすると、NullReferenceException がスローされます。thisBTIL.symptoms = thisTB.Text;

どんな助けでも大歓迎です!どうもありがとう。

4

1 に答える 1

1

キャスト ロジックを次のように書き直すことをお勧めします。

TextBox thisTB = Panel2.FindControl("symptoms_" + i.ToString()) as TextBox;

// Check to make sure the text box exists before we try to use it
if(thisTB != null)
{
    thisBTIL.symptoms = thisTB.Text;
}

キャストが失敗した場合、asオペレーターは例外をスローしませんが、代わりに を返しますnull。したがってnullif.

于 2013-10-31T14:26:45.430 に答える