1

リストボックスコントロールがあります。ユーザーがクリックすると、特定のIDを使用するようにカスタムコントロールに指示します。

カスタムコントロールは毎回(動的に)同じものを描画し、このIDに応じて異なるコンテンツをロードするだけです(データベースからコントロールのような動的な形式にロードされます)。

さて、ビューステートの流出に問題があります。リストボックスをクリックしてID#1を読み込むと、すべて見栄えがします。次に、ID#2をクリックすると、カスタムコントロール内に作成されたすべてのテキストボックスコントロールは、ID#1に配置されたものと同じものになります。したがって、リストボックスインデックスが変更された場合、ビューステートをクリアする必要がありますが、これを機能させることはできません。

すべてのコントロールはPage_Loadでも作成されます。

Page_LoadでViewState.Clear()を試しましたが、何もしませんでした。

カスタムコントロールをINamingInterfaceから派生させましたが、IDはまだビューステートと一致していると思います。

カスタムコントロールIDを一意のもの( "CONROL _" + id.ToString()など)に変更してみました。カスタムコントロールを含むパネルでも同じことを試しました。

私はこのビューステートを取り除くことができないようです!

編集OKここに問題を示すコードがあります

public partial class _Default : System.Web.UI.Page 
{
protected void Page_Load(object sender, EventArgs e)
{
    if (ddl.SelectedValue == "1")
    {
        Create("ID #1");
    }
    else if (ddl.SelectedValue == "2")
    {
        Create("ID #2");
    }
 }
void Create(string text)
{
    TextBox t = new TextBox();
    t.Text = text;
    pnl.Controls.Add(t);
}
}

マークアップ:

<div>
    <asp:Panel ID="pnl" runat="server">
        <asp:DropDownList ID="ddl" runat="server" AutoPostBack="True">
        <asp:ListItem Text="id 1" Value="1">
        </asp:ListItem>
        <asp:ListItem Text="id 2" Value="2"></asp:ListItem>
        </asp:DropDownList>
    </asp:Panel>
</div>

このコードを実行すると、テキストボックスの内容を変更してからドロップダウンリストを変更すると、前に入力した内容が上書きされるのではなく、そこに保持されることに気付くでしょう。

これに関する私の基本的な目標は、ID#2に変更したときに、テキストボックスに「ID#2」が何があっても(できればビューステートを完全に無効にせずに)配置するようにすることです。

4

3 に答える 3

1

テキストコントロールのIDを設定すると、古い値が保持されません。すべてのコントロールに一意のIDを付けていますか?

void Create(string text)
{ 
    TextBox t = new TextBox();
    t.ID = text;
    t.Text = text;
    pnl.Controls.Add(t);
}
于 2009-10-29T20:54:02.713 に答える
0

あなたはそれをそのようにすることはできません。

ビューステートが正しく機能するには、ロードする前にすべてのコントロールを同じIDで作成する必要があります。したがって、コントロール定義をセッションに保存してから再作成し、ASP.NETと同じIDを使用して、ビューステートからプロパティを読み込む必要があります。Page_loadは遅すぎます。PreLoadで実行してください。

ただし、デザイン時にすべてのコントロールを作成し、visibleをfalseに設定し、それらの可視性を変更して、ビューステートが正しく機能するようにする方が簡単です。

于 2009-10-29T21:21:54.093 に答える
0

実際、これはもはや関係ありません。動的に作成されたコントロールのビューステートを無効にするだけで修正されました。これはすべての場合に機能するわけではありませんが、この場合、ユーザーが押すことができる2つのボタン(動的コントロールを使用するため)またはフォームを切り替えるためのリストボックスがあります。2つのボタンはどちらもコントロールの状態をデータベースに保存するため、実際にはビューステートは必要ありません(ビューステートと、それがコントロールとどのように相互作用するかを考えると、常に混乱します。)

したがって、基本的なアドバイス:ビューステートの制御に問題がある場合は、実際にそれが必要であることを確認してください。

于 2009-10-30T19:04:36.913 に答える