1

ASP.NET 4.0。ユーザーが顧客のライセンスのアイテムを表示/編集できるようにしたいと考えています。ライセンスには 1-M 製品があり、製品のリストは時間の経過とともに拡大するため、次のように、ライセンスにその製品があるかどうかを示すチェックボックスを使用して、(Page_Load 内の) すべての製品のリストを動的に作成しています。

CheckBox cbxProduct = new CheckBox();
cbxProduct.ID = "cbxProduct" + product.ID.ToString();

これらの動的コントロールを見つけて、PostBack でそれらの値にアクセスするには、次を使用します。

CheckBox cbxProd = (CheckBox)pnlLicenseDetails.FindControl("cbxProduct" + productID.ToString());

ただし、Page_Load (または Page_Init は問題ではないようです) で再作成されたばかりの場合に限ります。問題は、ユーザーがボックスのチェックを外してライセンスから製品を削除し、結果を保存できるようにしたいことです。しかし、チェックボックスを見つけてその値を決定するには、コントロールを再作成する必要があります。これにより、もちろん、ユーザーが入力した値はすべて消去されます。

チェックボックスを再作成せずに参照しようとすると、もちろん「オブジェクト参照が設定されていません...」というエラーが発生します。そのため、ユーザーが入力した値が消去される前に、その値を取得する方法が必要です。

提案?

4

1 に答える 1

0

Page_Init で動的コントロールを作成する必要があります。すべてのリクエストに対して同じ方法で作成する必要があります。つまり、同じコードを実行してコントロールを作成し、IsPostBack に関係なく、ページが読み込まれるたびにそれをコントロール コレクションに追加します。

また、動的コントロールのインスタンスをプライベート メンバー変数に保存することをお勧めします。これにより、FindControlコストがかかる可能性があるため、呼び出す必要がなくなります。

製品のリストがどこかにあるように見えるので、辞書を使用してチェックボックスを保存する例を次に示します。

public partial class _Default : Page
{
    private Dictionary<Int32,CheckBox> _myDynamicCheckBoxes;

    protected override void OnInit(EventArgs e)
    {
        _myDynamicCheckBoxes = new Dictionary<Int32,CheckBox>();

        foreach (var product in _listOfProducts)
        {
            var chkBox = new CheckBox {ID = "CheckBox" + product.ID.ToString()};
            _myDynamicCheckBoxes.Add(product.ID,chkBox);
            //add the checkbox to a Controls collection
        }
    }
}

次に、製品があり、関連するチェックボックスを見つけたい場合は、コードの別の場所で使用できます。var aCheckBox = _myDynamicCheckBoxes[product.ID];

于 2013-06-20T17:23:38.457 に答える