Im aktuellen Projekt gibt es einen Suchteil, der es den Benutzern ermöglicht, Felder im Suchergebnisraster anzuzeigen.
Daher werden zwei ListBoxenverwendet,
um alle anzeigbaren Felder bzw. ausgewählten Anzeigefelder aufzulisten
im Vordergrund, um die Elemente zwischen den beiden Listenfeldern hinzuzufügen, zu löschen und zu verschieben
(Auf keinen Fall, der Test-MM sagte, dass das Hintergrundereignis aktualisiert wird und es unangenehm aussieht ...)
Also habe ich zwei HTML-Schaltflächen erstellt
Die Ereignisse sind wie folgt: (Machen Sie sich vorerst keine Sorgen um Hidden1)
Funktion Test(lbFieldsSelect,value)
{
for (j = 0;j<lbFieldsSelect.length; j++)
{
if (lbFieldsSelect.options[j].value == value) return true;
}
return false;
}
Funktion 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))
{
//Das Feld wurde ausgewählt
weitermachen;
}
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;
}
}
}
Funktion 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;
}
}
}
Unerwarteterweise war das an der Rezeption hinzugefügte ListItem beim Senden im Hintergrund verschwunden. Bei sorgfältiger Überlegung muss es sein, dass asp.net den ViewState nach der Änderung des ListBox-Clients beim Zurücksenden nicht hinzugefügt hat.
Tatsächlich kann man MS nicht die Schuld geben, auch wenn die Tabelle keinen ViewState hat (laut MS ist die Tabelle nur ein Container, und die Steuerelemente in der Tabelle müssen ViewState beibehalten).
ListBox, eine Sache, die vom Client selten geändert wird, wird offensichtlich nicht mehr benötigt, als etwas zu erstellen, das den Ansichtsstatus beibehalten kann, um die Elemente in die ListBox einzufügen. Ich habe also
den entsprechenden Code auf der Hidden1-Serverseite über:
private void RestorelbFieldsSelect()
{
string[] sField =Hidden1.Value.Split('#');
//lstShowField.Items.Clear();
DataTable dtField = new 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] == "") continue;
DataRow row = dtField.NewRow();
row[0] = sField[i].Split( '@')[0 ];
row[1] = sField[i].Split( '@')[1 ];
dtField.Rows.Add(row);
}
lbFieldsSelect.DataSource = dtField;
lbFieldsSelect.DataTextField = "sDisplayName";
lbFieldsSelect.DataValueField = "sFieldName";
lbFieldsSelect.DataBind();
}
In diesem Fall wird die ListBox bei jedem Laden der Seite entsprechend dem ausgeblendeten Status aktualisiert.
Das Ziel unseres Projekts wurde erreicht (nur das Element der ListBox wird benötigt, eine Auswahl usw. muss nicht berücksichtigt werden)
Wenn Sie ausgewählte Elemente verarbeiten müssen, benötigen Sie möglicherweise ein weiteres Hidden.
http://www.cnblogs.com/calmzeal/archive/2006/07/26/460068.html