Dans le projet actuel, il y a une partie recherche. Il est nécessaire d'afficher les champs dans la grille des résultats de recherche pour permettre aux utilisateurs de choisir.
Par conséquent, deux ListBox sont utilisées pour lister respectivement tous les champs affichables et les champs d'affichage sélectionnés,
et js est utilisé dans. au premier plan pour contrôler les éléments entre les deux listes. Ajouter, supprimer et déplacer.
(Pas question, le test mm disait que l'événement en arrière-plan est actualisé et que cela semble inconfortable...)
J'ai donc créé 2 boutons html
Les événements sont les suivants : (Ne vous inquiétez pas pour Hidden1 pour l'instant)
fonction Test (lbFieldsSelect, valeur)
{
pour (j = 0;j<lbFieldsSelect.length; j++)
{
if (lbFieldsSelect.options[j].value == value) renvoie vrai ;
}
renvoie faux ;
}
fonction SelectField()
{
var lbFields = document.getElementById("lbFields");
var lbFieldsSelect = document.getElementById("lbFieldsSelect");
var Hidden1 = document.getElementById("Hidden1");
pour (i = 0;i<lbFields.length; i++)
{
si (lbFields.options[i].selected)
{
if (Test(lbFieldsSelect,lbFields.options[i].value))
{
//Le champ a été sélectionné
continuer;
}
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 ;
}
}
}
fonction UnSelectField()
{
var lbFields = document.getElementById("lbFields");
var lbFieldsSelect = document.getElementById("lbFieldsSelect");
var Hidden1 = document.getElementById("Hidden1");
pour (i = 0;i<lbFieldsSelect.length; i++)
{
si (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 ;
}
}
}
De manière inattendue, lorsqu'il a été soumis à l'arrière-plan, le ListItem ajouté à la réception avait disparu. En y réfléchissant bien, il faut que asp.net n'ait pas ajouté le ViewState après le changement du client ListBox lors de la publication.
En fait, vous ne pouvez pas blâmer ms, même la table n'a pas ViewState (selon ms, la table n'est qu'un conteneur, et il est nécessaire que les contrôles de la table maintiennent ViewState)
ListBox, une chose qui est rarement modifiée par le client, n'est évidemment plus nécessaire. Je n'ai pas d'autre choix que de créer quelque chose qui puisse maintenir l'état d'affichage pour mettre les éléments dans la listBox. J'ai donc
le code correspondant côté serveur Hidden1. au-dessus de:
vide privé RestorelbFieldsSelect()
{
string[] sField =Hidden1.Value.Split('#');
//lstShowField.Items.Clear();
DataTable dtField = new DataTable();
dtField.Columns.Add("sDisplayName","".GetType());
dtField.Columns.Add("sFieldName","".GetType());
pour (int i = 0 ; i < sField.Length ; i ++)
{
if (sField[i] == null || sField[i] == "") continuer ;
Ligne DataRow = dtField.NewRow();
rangée[0] = sField[i].Split( '@')[0 ];
rangée[1] = sField[i].Split( '@')[1 ];
dtField.Rows.Add(ligne);
}
lbFieldsSelect.DataSource = dtField;
lbFieldsSelect.DataTextField = "sDisplayName";
lbFieldsSelect.DataValueField = "sFieldName";
lbFieldsSelect.DataBind();
}
Dans ce cas, la ListBox sera mise à jour en fonction du statut masqué à chaque chargement de la page.
Le but de notre projet a été atteint (seul l'Item de la ListBox est nécessaire, il n'y a pas besoin d'envisager la sélection, etc.)
Si vous devez traiter les éléments sélectionnés, vous aurez peut-être besoin d'un autre masqué.
http://www.cnblogs.com/calmzeal/archive/2006/07/26/460068.html