現在のプロジェクトでは、検索結果グリッドにフィールドを表示してユーザーが選択できるようにする必要がある
ため、表示可能なすべてのフィールドと選択された表示フィールドをそれぞれリストするために 2 つの ListBox が使用されます
。フォアグラウンドで 2 つのリストボックス間の項目を追加、削除、移動します。
(まさか、テストMMではバックグラウンドイベントが更新されて気持ち悪いとか言ってましたが…)
そこでHTMLボタンを2つ作りました
イベントは次のとおりです: (今のところ、Hidden1 については心配しないでください)
関数 Test(lbFieldsSelect,value)
{
for (j = 0;j<lbFieldsSelect.length; j++)
{
if (lbFieldsSelect.options[j].value == value) は true を返します。
}
false を返します。
}
関数SelectField()
{
var lbFields = document.getElementById("lbFields");
var lbFieldsSelect = document.getElementById("lbFieldsSelect");
var Hidden1 = document.getElementById("Hidden1");
for (i = 0;i<lbFields.length; i++)
{
if (lbFields.options[i].selected)
{
if (Test(lbFieldsSelect,lbFields.options[i].value))
{
//フィールドが選択されました
続く;
}
lbFieldsSelect.options.add(document.createElement("OPTION"));
lbFieldsSelect.options[lbFieldsSelect.length-1].text=lbFields.options[i].text;
lbFieldsSelect.options[lbFieldsSelect.length-1].value=lbFields.options[i].value;
Hidden1.value = Hidden1.value + "#" + lbFields.options[i].text + "@" + lbFields.options[i].value;
}
}
}
関数UnSelectField()
{
var lbFields = document.getElementById("lbFields");
var lbFieldsSelect = document.getElementById("lbFieldsSelect");
var Hidden1 = document.getElementById("Hidden1");
for (i = 0;i<lbFieldsSelect.length; i++)
{
if (lbFieldsSelect.options[i].selected)
{
lbFieldsSelect.options.add(document.createElement("OPTION"));
lbFieldsSelect.options[lbFieldsSelect.length-1].text=lbFields.options[i].text;
lbFieldsSelect.options[lbFieldsSelect.length-1].value=lbFields.options[i].value;
Hidden1.value = Hidden1.value + "#" + lbFields.options[i].text + "@" + lbFields.options[i].value;
}
}
}
思いがけず、バックグラウンドに送信すると、フロント デスクに追加された ListItem が消えていました。よく考えると、ポストバック時に ListBox クライアントの変更後に asp.net が ViewState を追加しなかったのでしょう。
実際、テーブルに ViewState がない場合でも、ms を責めることはできません (ms によれば、テーブルは単なるコンテナであり、テーブル内のコントロールが ViewState を維持する必要があるとのことです)。
ListBox はクライアントによってほとんど変更されないものですが、もう必要ないので、listBox に項目を配置するためにビューステートを維持できるものを作成するしかありません。そのため、
Hidden1 サーバー側に対応するコード
を用意します。その上:
private void RestorelbFieldsSelect()
{
string[] sField =Hidden1.Value.Split('#');
//lstShowField.Items.Clear();
DataTable dtField = 新しい DataTable();
dtField.Columns.Add("sDisplayName","".GetType());
dtField.Columns.Add("sFieldName","".GetType());
for (int i = 0 ; i < sField.Length ; i ++)
{
if (sField[i] == null || sField[i] == "") 続行;
DataRow 行 = dtField.NewRow();
row[0] = sField[i].Split( '@')[0 ];
row[1] = sField[i].Split( '@')[1 ];
dtField.Rows.Add(行);
}
lbFieldsSelect.DataSource = dtField;
lbFieldsSelect.DataTextField = "sDisplayName";
lbFieldsSelect.DataValueField = "sフィールド名";
lbFieldsSelect.DataBind();
}
この場合、ListBox はページが読み込まれるたびに非表示ステータスに応じて更新されます。
プロジェクトの目的は達成されました (ListBox の項目のみが必要で、選択などを考慮する必要はありません)。
選択した項目を処理する必要がある場合は、別の非表示が必要になる場合があります。
http://www.cnblogs.com/calmzeal/archive/2006/07/26/460068.html