[ bokac @ 12.03.2004. 17:42 ] @
Imam dve Windows forme Form1 i Form2. U Form1 imam DataGrid kontrolu koju punim podacima iz jedne tabele Access baze. U Form2 treba da prikazem podatke sa detaljima na osnovu korisnikovog izbora duplim klikom na neku stavku u grid-u. Ovaj problem sam resio (donekle) na ovaj nacin:
Code:

public class Form1
{
{
...
//negde na pocetku koda
string text="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=baza.mdb";
string upit="SELECT ime, prezime, adresa FROM tabela1";
OleDbConnection veza=new OleDbConnection(text);
veza.Open();
OleDbDataAdapter da=new OleDbDataAdapter(upit, veza);
DataTable dt=new DataTable();/// koristim DataTable
da.Fill(dt);
veza.Close();
dataGrid1.DataSource=dt;
}
public void dataGrid1_DoubleClick(object sender, System.EventArgs e)
{
if(dataGrid1.CurrentRowIndex>=0)
{

Form2 f2=new Form2(this);
f2.ShowDialog();
f2.Dispose();
}
}
public string Naziv
{
get
{
return (dataGrid1[dataGrid1.CurrentRowIndex,0]).ToString();
}
}
}

a u Form2

public class Form2
{
{
public Form2(Form1 parent)
{
this.parent=parent;
InitializeComponent();
Puni();
}
public void Puni()
{
string text="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=baza.mdb";
string upit="SELECT * FROM tabela1 WHERE ime='"+ parent.Naziv +"'";
OleDbConnection veza=new OleDbConnection(text);
......
}
}

i ovde jednostavno dobijem trazeni podatak iz baze.

Problem je sledeci kada hocu da isto to uradim samo preko ID vrednost stavke iz tabela1. A takodje pritom i podesavam izgled grida da se ne vidi vrednost ID.
Code:

public class Form1
{
{
...
///negde na pocetku koda
string text="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=baza.mdb";
string upit="SELECT id, ime, prezime, adresa FROM tabela1";
OleDbConnection veza=new OleDbConnection(text);
veza.Open();
OleDbDataAdapter da=new OleDbDataAdapter(upit, veza);
DataSet ds=new DataSet();/// skrecem paznju da sam ovde upotrebio DataSet
da.Fill(ds, "tabela1");
veza.Close();
DataGridTableStyle tstyle=new DataGridTableStyle();
tstyle.MappingName="glavna2";
dataGrid1.TableStyles.Clear();
dataGrid1.TableStyles.Add(tstyle)
dataGrid1.DataSource=ds.Tables["glavna2"];
///dalje ide podesavanje sirine kolona(e)
AutoSCol(0, 0); ///gde za prvu kolonu id stavljam vrednost 0 kako se ne bi videla
}
public void AutoSCol(int col, int width)
{
///kod koji to odradjuje
}
public void dataGrid1_DoubleClick(object sender, System.EventArgs e)
{
if(dataGrid1.CurrentRowIndex>=0)
{
Form2 f2=new Form2(this);
f2.ShowDialog();
}
}
public int ID
{
return /// ??? ovde nastaje problem prosledjivanja kliknute kolone prema Form2
/// naglasavam da je vrednost id u tabela1 tipa AutoNumber
}


public class Form2
{
{
public Form2(Form1 parent)
{
this.parent=parent;
InitializeComponent();
Puni();
}
public void Puni()
{
string text="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=baza.mdb";
string upit="SELECT * FROM tabela1 WHERE id='"+ parent.ID +"'";
OleDbConnection veza=new OleDbConnection(text);
......
}
}

Pokusavao sam to na sve nacine kako bi radilo kao u primeru 1 ali nista.
Nadam se da je pitanje dovoljno jasno i da nisam propustio nista bitno od koda. Hvala unapred na pomoci.
[ mmix @ 13.03.2004. 00:04 ] @
Jel dobijaš neku grešku ili jednostavno ne radi?
[ bokac @ 13.03.2004. 02:18 ] @
Kada stavim,
Code:

public string ID
{
get
{
return (dataGrid1[dataGrid1.CurrentRowIndex,0]).ToString();
}
}

jednostavno kompajler nista ne signalizira ali ni ne dobijem nikakav rezultat.

Kada stavim,
Code:

public int ID
{
get
{
return (dataGrid1[dataGrid1.CurrentRowIndex,0]).ToString();
}
}

naravno dobijem gresku Cannot implicitly convert type 'string' to 'int'

a kada stavim,
Code:

public int ID
{
get
{
return (dataGrid1[dataGrid1.CurrentRowIndex,0]);
}
}

dobijem Cannot implicitly convert type 'object' to 'int'

A ovo su samo neki od primera a da ne pricam sta sam sve pokusavao sa Parse(), Convert.ToInt32 idt.... Nista od toga nije dalo rezultate. Ponavljam ID je u bazi tipa AutoNumber, ono u prvom primeru sto je radilo je ipak "ime" tipa Text.
[ degojs @ 13.03.2004. 02:27 ] @
Ako nije problem, upload-uj deo projekta pa da pogledamo..

Jesi li siguran da to nije zato što je kolona skrivena?

Drugo, pošto imaš redni broj reda koji je kliknut, možeš li da potrebnu vrednost pročitaš iz DataTable-a koji je prikazan u DataGrid-u? Nešto poput:

return ((DataTable)(this.dataGrid1.DataSource)).Rows[dataGrid1.CurrentRowIndex][0];

Umesto [0] na kraju možeš i da ideš sa imenom kolone npr. ["AutoID"} ili kako si već dao ime istoj. Naravno, sve to uz potrebnu konverziju u int (System.Convert.ToInt32) ili string, kako ti već treba.
[ bokac @ 13.03.2004. 11:50 ] @
Fora je u tome sto sam u ovom slucaju koristio DataSet, a ne DataTable kao u primeru 1 koji mi radi. Koliko sam shvatio sa DataTable je stvar mnogo laksa, ali nisam provalio kako da korisniku omogucim tako dobar prikaz (skrivena id vrednost itd.) kao sa DataSet-om sa kojim se to vrlo elegantno radi. Mozda imam potpuno pogresan pristup problemu, sada pokusavam preko objekta tipa HitTestInfo nesto kao dataGrid1.HitTest(), pa onda preko
Code:
BindingManagerBase bman=this.BindingContext[dataGrid1.DataSource, dataGrid1.DataMember];
bman.Position=ht.Row;


ali mi i dalje ne uspeva da se snadjem. Videcu da upload-ujem tu klasu odakle treba da izcupam id vrednost kliknutog reda, ali ne mogu da provalim kako to ovde da zakacim uz poruku : )
[ degojs @ 13.03.2004. 12:25 ] @
Pa nije problem ako si koristio DataSet pošto on sadrži DataTable. Samo kastiraj u DataSet umesto u DataTable i onda daj referencu na potrebnu tabelu.

return ((DataSet)(this.dataGrid1.DataSource)).Tables[0].Rows[dataGrid1.CurrentRowIndex][0];

Naravno i ovde umesto Tables[0] možeš da ideš sa Tables["ime_tabele_u_dataSetu"].

Pozdrav
[ bokac @ 13.03.2004. 15:43 ] @
Code:
public int ID
{
get
{
return int.Parse(((DataSet)(this.dataGrid1.DataSource)).Tables["table1"].Rows[dataGrid1.CurrentRowIndex][0]);
}
}


upravo pokusavam ali kompajler izbacuje gresku:

Argument '1': cannot convert from 'object' to 'string'
The best overloaded method match for 'int.Parse(string)' has some invalid arguments


a kada stavim bez int.Parse() onda izbaci:

Cannot implicitly convert type 'object' to 'int'
[ mmix @ 13.03.2004. 18:12 ] @
Citat:
Argument '1': cannot convert from 'object' to 'string'
The best overloaded method match for 'int.Parse(string)' has some invalid arguments

a kada stavim bez int.Parse() onda izbaci:
Cannot implicitly convert type 'object' to 'int'


Ne možeš da radiš int.Parse nad object-om, int.Parse radi samo nad stringovima (možda i nad boxovanim stringovima, da ne grešim dušu). Ako si siguran da ti je varijabla int tipa, najobičniji cast "(int)" radi posao, pošto je onda taj object u stvari boxovani integer. Ne znam da li će ti ovo rešiti ceo problem, ali bi trebalo da te oslobodi kompajlerske greške

Code:

int x = 5;
object y = x;
x = (int)y;


[ bokac @ 13.03.2004. 20:36 ] @
Citat:

int x = 5;
object y = x;
x = (int)y;


Eksplicitna konverzija, to je zaista "smirilo" kompajler ali na zalost jos nisam dosao do konacnog resenja problema. Razmisljam da se ipak opredelim za prosledjivanje vrednosti po string tipu.


[ degojs @ 13.03.2004. 21:26 ] @
Pa napisao sam ti da ideš sa

return Convert.ToInt32(((DataSet)(this.dataGrid1.DataSource)).Tables["table1"].Rows[dataGrid1.CurrentRowIndex][0]);

a ako treba string onda jednostavno izostaviš ovo Convert.ToInt32, a dodaš jedno .ToString() na kraju.

U čemu je sad problem? :) Odnosno, skoro da je nemoguće da ovo ne radi :)
[ bokac @ 14.03.2004. 12:02 ] @
I jesam degojs upravo sam tako i pokusavao ali kao sto rekoh nije radilo. Jednostavno nisam dobijao ocekivani rezultat a ni sam nisam otkrio zbog cega. Zakljucio sam da je najbolje resenje prosledjivanje po stringu za polje u bazi koje je tipa Text, ali se ne ponavlja:
Code:

public string ID2
{
get
{
return (dataGrid1[dataGrid1.CurrentRowIndex,1]).ToString();
}
}

ovo jednostavno resenje je uradilo pravu stvar (radi). Mozda nije bas najbolji nacin rada ali u mom slucaju olaksavajuca okolnost je ta sto mi je sama baza u projektu ReadOnly pa mi to ide na ruku u ovakvom pristupu. Hvala svima na pomoci.
[ degojs @ 14.03.2004. 20:52 ] @
Citat:
za polje u bazi koje je tipa Text


Eee, pa ako je tipa Text u bazi onda ga prvo i pročitaj sa .ToString. Kad dobiješ string koji sadži broj (npr. "112") onda može Convert.ToInt32.

Zašto je polje koje sadrži brojeve tipa Text a ne Number u bazi? :)

[ bokac @ 15.03.2004. 10:49 ] @
Veruj mi bazu nisam ja pravio nego neko ko se ne razume u to bas najbolje. Nemas pojma koliko sam se namucio zbog rada sa lose dizajniranom bazom. Inace baza je puna brojeva koja su poljima tipa Text (osim prave ID vrednosti koja je jedina broj, naravno AutoNumber). Posto sam naravno kao i svi pokusavao da vrsim pretrazivanje preko polja ID nikako mi nije islo, onda sam pronasao neko drugo polje cija se vrednost ne ponavlja (bar sam ja tako zakljucio) ali je tipa Text pa sam odlucio da celu pricu idem preko tog polja i ok radi. S obzirom da mi nije nikako islo ono prosledjivanje kliknutog reda DataGrid-a preko ID number, onda sam bio prinudjen da radim na ovaj nacin.