Cum să atribuiți dataGrid altor dateGrid în Flex. a = b nu funcționează

in Flex am asa ceva:

  var dg:DataGrid = new DataGrid();    
  if (something) dg = dg1 else if (something_2) dg = dg2;
  dg.dataProvider.getItemAt(3).id;    

și dg indică ÎNTOTDEAUNA spre DataGrid (chiar dacă dg1 are numele DataGrid_test și dg2 = DataGrid_test2) și în cele din urmă se acționează asupra primului meu DataGrid (DataGrid_test). De ce? Cum pot trece dg1 sau dg2 la dg?

Aici este lipit codul aproape complet al acestei părți a aplicației. L-am editat pentru a fi mai clar.

    var dg:DataGrid = null; 
    if ( currentState == "state1" ) { //if this condition is true then app. go into if and
        dg = dataGrid_first; // make dg = DataGrid (1)
        test.text = "inco";  // shows "inco" in "test" label
    } else if ( currentState == "state2" ) { // if this is true then app. go..
        dg = dataGrid_second; //here and set dg as DataGrid (exactly!) (2)
        test.text = "outgo"; // and change test label into blank text (earlier text disapears)
    }
    search(dg);

Este modificat cu sfatul lui „@splash” Încă nu funcționează.

EDIT: Am făcut această editare pentru a răspunde tuturor celor care mă ajutați cu asta :) Cred că va fi cea mai bună cale. În codeblock de mai sus am adăugat comentarii. (Vă rugăm să citiți acum comentariile și după aceea reveniți aici :) ) Acum voi explica exact ce se întâmplă. Îl depanez de multe ori și iată rezultatele: dg indică către DataGrid (ca componentă în flex, nu ca dataGrid_first), trebuia să extind DataGrid, așa că acum este componenta ColorColumn (nu știu dacă am numit-o corect) , nu DataGrid. Și dg indică spre ColorColumn, nu spre dataGrid_first sau dataGrid_second. Am încercat chiar și astăzi același lucru care sugerează @splash:

if ( currentState == "state1" ) { 
    test.text = "inco"; 
    search(dataGrid_first); 
} else if ( currentState == "state2" ) {
    test.text = "outgo";
    search(dataGrid_second);
}

și căutarea încă punctează la ColorColumn :/ Problema mea este foarte ușoară - vreau doar să trec să caut diferite dateGrid pe fiecare stare. Dacă aveți alte idei despre cum pot face asta în mod corect, atunci voi fi încântat să aud despre asta. :) Dar tot nu inteleg de ce nu merge. Funcția mea de căutare folosește algoritmul Boyer-Moor pentru a căuta text prin dataGrid.dataProvider. Dacă găsește ceva, atunci este împins într-o matrice nouă și, după ce trec întregul DataProvider, colorez rândurile cu cuvântul căutat.


person Gut6    schedule 13.05.2011    source sursă
comment
Nu sunt sigur că înțeleg ceea ce ceri. Desigur, indică către „DataGrid” care este clasa... De asemenea, nu vă înțeleg „logica”. De ce ai crea vreodată un DataGrid dacă oricum ai de gând să-l schimbi? Cod extrem de complicat..   -  person J_A_X    schedule 13.05.2011
comment
Scriu o aplicație care are 2 DataGrid-uri diferite în state. În prima stare, DataGrid are id= dg1 în a doua id=dg2. Am și un buton care are o acțiune Căutare. Butonul este în ambele state. Acum încerc să fac acțiunea că apăsând Căutare în prima stare trece la funcția de căutare dg1, apăsând Căutare în a doua stare trecând dg2. Este ușor, sunt sigur, dar îmi lipsește ceva... :/ Ai scris: De ce ai crea vreodată un DataGrid dacă ai de gând să-l schimbi oricum?. Ce modalitate mai bună sugerezi să faci asta?   -  person Gut6    schedule 14.05.2011
comment
Mi-ar plăcea să sugerez mai bine, dar nu pot sugera o astfel de întrebare tehnică. Ce încerci să realizezi făcând asta?   -  person J_A_X    schedule 14.05.2011
comment
Răspund la o întrebare similară după această postare, așa că o voi trece aici pentru a: vreau să fac căutări ale funcției de căutare prin diferite dateGrid.dataProvider în diferite state. În starea1 funcția de căutare ar trebui să caute text în dg1, iar în starea2 funcția de căutare ar trebui să caute în dg2.   -  person Gut6    schedule 15.05.2011
comment
Dar de ce ai nevoie de state? Care sunt căutările? De ce sunt 2?   -  person J_A_X    schedule 15.05.2011
comment
1. Am nevoie de state pentru ca in 'state1' am venituri si in 'state2' am outgo. 2. Căutarea este pentru căutarea „tabelelor” de venituri/ieșiri pentru numele textului tastat (de exemplu, am 100 de venituri diferite în dataGrid și vreau să caut cele care au în nume „cărți”. Tastez intrarea de căutare, apăs pe butonul de căutare și asta va declanșa funcția de căutare.În state1 ar trebui să caute prin dataGrid_first.dataProvider în state2 ar trebui să caute în dataGrid_second.dataProv.. 3. există și mai multe state, dar trebuie să caut doar în acele 2 :)   -  person Gut6    schedule 15.05.2011
comment
Ei bine, acestea sunt câteva soluții aici. Puteți folosi stări, dar nu cred că acesta este cel mai bun lucru în acest caz. Dacă este ceva, utilizați doar un viewstack pentru el, astfel încât să nu trebuie să „schimbați” dg vars. Nu te complica. Ar putea fi o opțiune mai bună să aveți o căutare pentru fiecare grilă de date decât să aveți 2 grile de date cu o singură căutare.   -  person J_A_X    schedule 15.05.2011
comment
Am și alte stări și unele funcționalități pe acele stări, așa că trebuie să le am în stări diferite. De asemenea, cred că este o modalitate mai bună de a avea o singură funcție de căutare, deoarece a făcut exact la fel în ambele cazuri. Doar dataGrid se schimbă. Deci, dacă voi avea 2 căutări, atunci va fi o mulțime de aproape același cod.   -  person Gut6    schedule 15.05.2011
comment
Ei bine, să vă spun adevărul, am o senzație instinctă (punerea de cuvinte) că nu vă proiectați aplicația în mod corespunzător, sau cel puțin nu împărțiți bucăți mari în bucăți mai mici pentru a reduce complexitatea și a crește reutilizarea. Dar din nou, nu pot să comentez cu adevărat, deoarece încă nu cunosc imaginea de ansamblu a ceea ce încercați să realizați.   -  person J_A_X    schedule 15.05.2011
comment
Este greu să scrii despre întreaga aplicație. Sunt sigur că, așa cum ai scris Tu, nu l-am construit foarte bine pentru că este primul meu program în Flex. :) Inca invat. Deci, poate să ne concentrăm acum doar asupra acestui fapt - cum pot realiza că funcția de căutare va obține date de la dg1.dataProvider (este Array) în stat1 și în starea 2 funcția de căutare va obține date de la dg2.dataProvider (de asemenea, array). Tocmai l-am testat în diferite moduri și am aflat că indiferent de obiectul pe care îl voi trece pe lângă acesta: search(income_arr) sau search(income_dataGrid), funcția de căutare primește clasă, nu obiect specific...   -  person Gut6    schedule 15.05.2011
comment
Hmm, asta e ciudat. A început să funcționeze! Se pare că am avut invalidateDisplayList() în locul greșit. L-am adăugat la dataProvider, nu la dataGrid. Este încă puțin ciudat de ce a funcționat într-o stare și în alta nu, dar îmi pot da seama singur. Pot să-ți dau cumva puncte pentru că m-ai ajutat? M-a ajutat foarte mult și sunt recunoscător pentru asta.   -  person Gut6    schedule 15.05.2011
comment
Deoarece invalidateDisplayList() este problema reală, a fost de fapt o problemă de vizualizare, nu una din structura de date din program. Vă rugăm să acceptați unul sau ambele răspunsuri.   -  person SteAp    schedule 15.05.2011
comment
Cred că acceptarea unuia sau a ambelor nu este o idee foarte bună, deoarece poate induce în eroare alți oameni care caută pe internet. Și pot accepta doar unul. Vreau să renunț la tine, dar trebuie să câștig 9 puncte în plus pentru a putea face asta. Când voi avea 15 puncte de rang, vă voi renunța la toate:) Mulțumesc din nou!   -  person Gut6    schedule 15.05.2011


Răspunsuri (2)


Dacă dg nu indică niciodată către dg1 și dg2, atunci expresiile dvs. (something) pot fi evaluate la false. Verificați valoarea condițiilor dvs. if - ar trebui să fie ușor de depanat.

Aceasta ar trebui să funcționeze:

var dg:DataGrid = null;    
if (something) 
    dg = dg1;
else if (something_2) 
    dg = dg2;
if (dg)
{
    // do something with dg
}

[Actualizare]

Încă nu văd de ce codul tău nu funcționează, dar l-ai putea simplifica astfel:

if ( currentState == "state1" ) { 
    test.text = "inco"; 
    search(dataGrid_first); 
} else if ( currentState == "state2" ) {
    test.text = "outgo";
    search(dataGrid_second);
}
person splash    schedule 13.05.2011
comment
Am așa ceva (acum am lipit codul din aplicație, mai devreme l-am schimbat pentru a-l scrie mai scurt). 'cod' var dg:DataGrid = null; if ( currentState == stare1 ) { dg = dataGrid_first; test.text = inco; } else if ( currentState == stare2 ) { dg = dataGrid_second; test.text = outgo; } 'cod' În starea 1 totul este OK, dar totuși dg primește DataGrid, nu dataGrid_first. Chiar și așa fac ceea ce vreau să fac. Testul de etichetă arată inco, deci dacă este bun. În starea 2 nu funcționează nimic. Nici dg nu primește dataGrid_second, nici testul nu arată outgo; - person Gut6; 14.05.2011
comment
Mulțumesc Splash pentru că m-ai ajutat. :) În conversația cu '@J_A_X' am scris că am găsit o soluție. Tocmai am adăugat incorect invalidateDisplayList() și de aceea am crezut că nu funcționează. Nu colorează rândurile care au fost rezultatul acțiunilor efectuate de acest cod. Voi 3 m-ați ajutat cu adevărat și sunt recunoscător pentru asta. Și, din păcate, nu am suficiente puncte pentru a vota Răspunsul tău în sus. Mulțumesc din nou pentru ajutor, voi încerca să plătesc înainte pentru utilizatorii stackoverflow :) - person Gut6; 15.05.2011

Mi-aș propune să scriu asta - deoarece cred că fie dg1, fie dg2 ar trebui să fie atribuite:

if (something) {

    dg = dg1;

} else {

    dg = dg2;

}

Pot exista cazuri în care if () {} else () {} nici nu execută primul sau al doilea bloc condiționat.

În cele din urmă, un mic indiciu, care elimină structural asignările nedorite în condiții if: scrieți întotdeauna partea stângă literală a operației de comparare: if ( "state1" == currentState ). Dacă ați tastat accidental = în loc de ==, compilatorul flex emite o eroare. Cealaltă notație atribuie în tăcere o valoare.

În plus: ați parcurs codul într-un singur pas și ați urmărit variabilele dg1, dg2 și dg? Dacă nu, setați un punct de întrerupere cu câteva rânduri înainte de instrucțiunea if și rulați codul pas cu pas de acolo înainte. Ce vezi?

Iată un alt sfat: utilizați aserțiuni pentru a verifica existența inconsistențelor:

package my.company.utilities {

  public function assert(expression:Boolean):void {

      // probably conditionally compile this statement
      if (!expression) {
          throw new Error("Assertion failed!");
      }

  } // assert

}

Folosește-l de ex. la începutul unei metode ca aceasta:

public function doTransaction( fromAccount:int, toAccount:int ) {

  assert( 0 < fromAccount );
  assert( 0 < toAccount );

}

O bună utilizare a assert este de a verifica variabilele în ceea ce privește intervalul lor. Din exemplul de mai sus, fromAccount și toAccount ar trebui să fie întotdeauna pozitive. Din cauza unei erori, valorile greșite pot fi transmise către doTransaction(). În acest caz, afirmația declanșează o eroare.

person SteAp    schedule 14.05.2011
comment
Trebuie să recunosc că sugestia dvs. de afirmație „dacă” este cu adevărat interesantă. Nu am văzut așa ceva mai devreme și trebuie să-l explorez mai profund. Ai scris că poate dacă nu execută unul dintre acele if, dar o face. În ambele dacă am inserat ceva de genul: 'test.text = inco;' iar in primul daca merge si in al doilea nu merge. Cred că cel mai bun mod de a scrie despre asta va fi editarea primei mele postări cu cod formatat și inserarea unor comentarii în el. Vă rugăm să căutați pe pagina respectivă la postarea mea. - person Gut6; 15.05.2011
comment
Da, scriu despre asta acum în primul post, dar am nevoie de câteva minute :) Încă îl editez - person Gut6; 15.05.2011
comment
Nu înțeleg pe deplin ce vrei să spui prin „set dg as DataGrid (exact!)”: DataGrid este o clasă, nu un obiect. Astfel, tipul de dg ar putea fi DataGrid, dar nu și valoarea. - person SteAp; 15.05.2011
comment
Doar de dragul clarității: vorbești despre o problemă vizuală? Reprezentarea vizuală a lui dg nu se schimbă? Sau vorbiți tehnic despre valoarea în program? - person SteAp; 15.05.2011
comment
Mă refer la valoarea în program. Vreau să fac acele căutări ale funcției de căutare prin diferite dateGrid.dataProvider în diferite state. În starea1 funcția de căutare ar trebui să caute text în dg1, iar în starea2 funcția de căutare ar trebui să caute în dg2. - person Gut6; 15.05.2011
comment
Poate că mi-ați roșit comentariile în conversația cu „@J_A_X”, așa că probabil că acum problema a fost cu totul alt loc. Mi-ai sugerat să-l depanez exact, așa că în cele din urmă am făcut puncte de întrerupere aproape în fiecare linie și mi-am dat seama că totul este OK. Pur și simplu nu am adăugat corect invalidateDisplayList() așa că rândurile din vizualizare nu au fost colorate. Vă voi da săgeată în sus (acest răspuns este util) pentru că voi (ei bine, toți cei care ați scris în acest subiect) m-ați ajutat cu adevărat prin diferite idei de soluție :) - person Gut6; 15.05.2011
comment
Oh, și, de asemenea, îți mulțumesc pentru afirmații. Mă întrebam mai devreme despre asta cum pot face ceva similar, așa că în viitor îl voi folosi. Comentariile pot fi editate doar timp de 5 minute (dați clic pe această casetă pentru a respinge). P.S-Din păcate, nu pot vota asta pentru că nu am suficiente puncte de rang. :/ - person Gut6; 15.05.2011