DevTrain Startseite Visual Studio 1 Magazin  
  
  
SUCHEN:  
ARTIKEL ONLINE: 525   

Kategorien
.NET
Datenbanken
Web
XML

Allgemein
Camp
Foren
Events
Persönliche Einstellungen
Registrieren
Prämien Shop
Kontakt
Impressum
Über DevTrain

Autoren



 

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!

 Betreff:
 Nachricht: Den Beitrag finden Sie nun unter: http://beta.devtrain.de/foren Die Benutzerdaten und Foreninhalte von beta.devtrain.de und www.devtrain.de sind die selben.
Sie können sich dort sogar per RSS über neue Inhalte informieren lassen.
Bei Problemen bitte direkt Mail an asp [AT] ppedv.de.

 Signatur:

  



Login
Username:


Passwort:






Passwort vergessen?

Visual Studio 1 Magazin

© Copyright 2003 ppedv AG