私の問題は、タイトルが言うよりも少し複雑です:
データベースのデータを別のユーザー コントロール (GridView と呼びます) に編集するためのユーザー コントロール (エディターと呼びます) を作成しました。
エディターは、グリッドビュー内の各行に使用されます (行はユーザーコントロールでもあり、エディターは挿入の場合でも行内のみです)。完全に機能しますが、挿入に使用しようとすると機能しません。
挿入と編集の唯一の違いは、次のフィールドです。
#region Field
/// <summary>
///
/// </summary>
//public Field Field { get { return DataItem as Field; } }
private Field _field;
[Bindable(true)]
public Field Field
{
get
{
if (IsInsert && _field == null)
{
_field = SubscriptionController.CreateField();
}
return _field;
}
set { _field = value; }
}
#endregion
このフィールド内には、リピーターにバインドするコレクションがあり、SubscriptionController.CreateField();
メソッドはフィールド クラスのインスタンスを作成するだけで、ここにあるすべてのコレクションはコードです。
public Field CreateField()
{
Field field = new Field();
field.Type = GetFieldTypes().First();
field.Label = new LocalizedStringCollection();
field.Values = new FieldValueCollection();
field.Selections = new FieldSelectionCollection();
foreach (Models.TrainingGroup trainingGroup in GetTrainingGroup())
{
foreach (Models.Division division in GetDivisions())
{
foreach (Models.ProfilStatusGroup profilStatusGroup in GetProfilStatusGroup())
{
field.Selections.Add(new Models.FieldSelection() { Selected = false, DivisionId = division.Id, ProfilStatusGroupId = profilStatusGroup.Id, TrainingGroupId = trainingGroup.Id });
}
}
}
}
バインドしたコレクションは viewstate に保存されます:
#region FieldValues
/// <summary>
/// Get/Set FieldValues from Viewstate
/// </summary>
public FieldValueCollection FieldValues
{
get
{
if (ViewState["FieldValues"] == null)
{
if (Field != null && Field.Values != null)
ViewState.Add("FieldValues", Field.Values);
else
ViewState.Add("FieldValues", new FieldValueCollection());
}
if (ViewState["FieldValues"] != null)
{
return (FieldValueCollection)ViewState["FieldValues"];
}
return null;
}
set
{
if (ViewState["FieldValues"] == null)
{
ViewState.Add("FieldValues", value);
}
else
{
ViewState["FieldValues"] = value;
}
}
}
#endregion
しかし、ポストバックすると、リピーター内のすべてのテキストボックスが空になります。