Forum: ASP.NET |
Thema:
problem mit aktualisierung einer listbox... |
Von:
G. Guest (
03.06.2004 11:00) |
hallo und mahlzeit!
ich habe grosse probleme mit der aktualisierung eines listbox-controls.
das ganze sollte folgedermassen funktionieren:
man lädt einen datensatz im editiermodus, da sind z.B.: mitarbeitername, geburtsdatum, ...
unter anderem sollte dort auch die zuständigkeit für einzelne abteilungen eingestellt werden können, also eine klassische m:n beziehung, da jeder mitarbeiter in beliebig vielen abteilungen einsatzbar ist.
es wird also ein listbox dargestellt, in der die einzelnen abteilungen dargestellt sind. mit einem klick auf einen button rechts daneben öffnet sich ein popup-fenster in dem nun 2 listboxen zu sehen sind. die linke enthält alle verfügbaren abteilungen aus der datenbank und die rechte die ausgewählten. nun kann man mittels drag und drop, pfeil rauf und runter oder einem klick auf den mistkübel die abteilungen zuteilen. wenn man nun das popup-fenster schliesst sollten die gewählten elemente in das aufrufende fenster übernommen und bei einem click auf "speichern" auch übernommen werden.
soweit so gut hier ein teil meines sourcecodes...
diese hier sind die javascript funktionen die ich brauche:
// ------------------------------------------------------------------
function moveOver()
{
var objdest=document.forms[0].lbxDest;
var objsource=document.forms[0].lbxSource;
var boxLength=objdest.length;
var selectedItem=objsource.selectedIndex;
var selectedText=objsource.options[selectedItem].text;
var selectedValue=objsource.options[selectedItem].value;
var i;
var isNew=true;
if(boxLength!=0) {
for(i=0;i<boxLength;i++) {
thisitem=objdest.options[i].text;
if(thisitem==selectedText) {
isNew=false;
break;
}
}
}
if(isNew) {
newoption=new Option(selectedText,selectedValue,false,false);
objdest.options[boxLength]=newoption;
}
objsource.selectedIndex=-1;
}
// ------------------------------------------------------------------
function removeMe()
{
var objdest=document.forms[0].lbxDest;
var boxLength=objdest.length;
var count=0;
var isSelected;
arrSelected=new Array();
isSelected=objdest.selectedIndex;
for(i=0;i<boxLength;i++) {
if(objdest.options[i].selected) {
arrSelected[count]=objdest.options[i].value;
}
count++;
}
var x;
for(i=0;i<boxLength;i++) {
for(x=0;x<arrSelected.length;x++) {
if(objdest.options[i].value==arrSelected[x]) {
objdest.options[i]=null;
}
}
boxLength=objdest.length;
}
objdest.selectedIndex=isSelected;
}
// ------------------------------------------------------------------
function saveMe(strfname)
{
var obj=opener.document.forms[0].elements[strfname];
while(obj.length>0) {
obj.options[obj.length-1]=null;
}
opener.generateList(strfname);
}
// ------------------------------------------------------------------
function generateList(strfname)
{
var x=new Array();
var obj=f1.document.forms[0].lbxDest;
for(i=0;i<obj.length;i++) {
x[x.length]=new Array(obj.options[i].text,obj.options[i].value)
}
f1.close();
for(i=0;i<x.length;i++) {
nopt=new Option(x[i][0],x[i][1],false,false)
document.forms[0].elements[strfname].options[document.forms[0].elements[strfname].length]=nopt;
}
}
// ------------------------------------------------------------------
function move(index,to)
{
var obj=document.forms[0].lbxDest;
var total=obj.options.length-1;
if(index==-1) return;
if(to==+1&&index==total) return;
if(to==-1&&index==0) return;
strtemp_text=obj.options[index].text;
strtemp_value=obj.options[index].value;
obj.options[index].text=obj.options[index+to].text;
obj.options[index].value=obj.options[index+to].value;
obj.options[index+to].text=strtemp_text;
obj.options[index+to].value=strtemp_value;
obj.selectedIndex=index+to;
}
und das ist der code der popup-seite:
private void Page_Load(object sender, System.EventArgs e)
{
if (!this.IsPostBack)
{
this.tableName = (string)Session["cmsTableName"];
this.realTableName = (string)Session["cmsRealTableName"];
this.conDB = (string)Session["cmsDB"];
this.recID = Convert.ToInt32(Request.QueryString["idx"]);
string sql = "";
string fieldName = "";
string pkName = "";
string content = "";
string[] relations;
fieldName = Request.QueryString["fieldname"];
// connection oeffnen ...
string dbString = MAConstants.dbFolder + this.conDB + ".mdb";
MAConnection.openConnection(conConnection, dbString, false);
// jetzt holen wir uns den inhalt des tabellenfeldes ...
pkName = MADBase.getPKNameDS(this.tableName);
sql = "SELECT " + fieldName + " " +
"FROM " + this.tableName + " " +
"WHERE " + pkName + "=" + this.recID;
OleDbCommand cmd = new OleDbCommand(sql, MAConnection.getConnection);
OleDbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
if (!reader.IsDBNull(0)) content = reader.GetString(0);
}
reader.Close();
// dann fuellen wir die linke listbox (mit allen werten)...
MASettings settings = new MASettings();
settings.getFieldSettings(this.tableName, true);
FieldSettings fieldSetting;
fieldSetting = settings.getFieldSetting(fieldName);
relations = fieldSetting.connectedTo.Split(';');
DataSet dsSource = MADBase.getRecordsDS(relations[0], "", "", "", relations[1]);
pkName = MADBase.getPKNameDT(dsSource.Tables[0]);
lbxSource.DataSource = dsSource;
lbxSource.DataValueField = pkName;
lbxSource.DataTextField = relations[1];
lbxSource.DataBind();
// nun befuellen wir noch die listbox mit den werten die selektiert sind...
DataSet dsDest = MADBase.getRecordsDS(relations[0], "", pkName, content, relations[1]);
lbxDest.DataSource = dsDest;
lbxDest.DataValueField = pkName;
lbxDest.DataTextField = relations[1];
lbxDest.DataBind();
// connection schliessen
MAConnection.closeConnection();
// jetzt noch das clientseitige javascript event zuteilen ...
lbxSource.Attributes.Add("onChange", "moveOver();");
btnUpdate.Attributes.Add("onClick", "saveMe('" + fieldName + "');");
}
}
alles schön, die werte werden auch in das aufrufende fenster übergeben, wenn man aber auf speichern klickt, gehen alle werte verloren!
die eigentliche seite wird auch rein zur laufzeit erstellt, also alle controls werden dynamisch generiert, das macht das ganze natürlich noch komplizierter!?
das komische an der sache ist folgendes:
eine ähnliche anwendung habe ich auch bei memo feldern, d.h.: man öffnet in einem popup einen kleinen html-editor, klickt auch speichern, der content wird ebenfalls mittels javascript in das aufrufende fenster übergeben und danach auch richtig gespeichert! bei einer listbox gehen die änderungen allerdings verloren!?!?!?!?!?
irgendeine idee?
DANKE
atmosfear
Antworten
Vorsicht bei der Eingabe: Die Zeichen ' oder -- sind nicht erlaubt!