Inhalt eines angeklickten Feldes im DataGrid

MeikeBehrens

Mitglied
Moin moin,

Ich muss den Inhalt eines angeklickten Feldes in einem DataGrid auslesen.
Mein DataGrid zeigt zur Zeit ein paar Zeilen eines tables einer SQL-DB an, und da ich den Primary-Key nicht im DataGrid darstellen möchte ihn aber trotzdem gebrauche, muss ich halt ein anderes feld auslesen, um von dort aus den PrimaryKey herauszufinden. hat da jemand von euch eine idee? mit mouseover bekomme ich es nicht hin, da es halt die angeklickte zeile sein muss.
In eurer Suche habe ich leider nichts entsprechendes gefunden.


Danke für eure Hilfe,

Meike
 
Hi,

die aktuelle Zeile solltest du auf diese Weise rausfinden:
Code:
DataTable table = .....;
myGrid.DataSource = table;
CurrencyManager currencyManager = (CurrencyManager)this.myGrid.BindingContext[table];
int primaryKey = Convert.ToInt32(((DataTable)this.myGrid.DataSource).Rows[currencyManager.Position]["pkColumn"]);
So steht es jedenfalls im Code meines Kollegens, habe es also nicht selber geprüft.

Ausblenden einer Spalte in einem DataGrid laut MSDN

Beides ungetestet!
 
geht das auch wenn man in die Reihe klickt?

Hallo nachmal, habe ein bischen versucht zzu tüfteln, aber bis jetzt macht er es bei mir so, dass man
1. genau auf die Linien zwischen den Zeilen klicken muss um es hin zu bekommen, das kann aber auch daran liegen, dass mein Code über ein on click event ausgeelöst wird, [Edit]jo, das ist der Fall[/Edit]

2. er immer den ersten Namen ausgibt und nicht den der aktuellen zeile.

Könnt ihr vieleicht mal schauen?

Code:
int tableindex = meinDataSet.Tables.IndexOf("OS_USER");
DataTable myTable = meinDataSet.Tables[tableindex];
CurrencyManager currencyManager = (CurrencyManager)this.dataGrid1.BindingContext[myTable];
string Nameb = meinDataSet.Tables[tableindex].Rows[currencyManager.Position]["NAME"].ToString();
MessageBox.Show(Nameb, "NAME = ");


Danke auf jeden fall für die versuchte Hilfe

Meike
 
Zuletzt bearbeitet:
Hi,

versuchs mal so
Code:
// global in der klasse 
CurrencyManager currencyManager = null;

private void FillGrid()
{
       DataTable dt = ...;
       this.myGrid.DataSource = dt;
       this.currencyManager = (CurrencyManager)this.myGrid.BindingContext[dt];
}

// Click_Event
private void CellClicked()
{
      string text = ((DataTable)this.myGrid.DataSource).Rows[this.currencyManager.Position]["spaltenName"].ToString();
      MessageBox.Show(text);
}

Hab im vorigen Post vergessen zu erwähnen das der CurrencyManager global sein muss. Sorry.

// edit

Ich hab hier noch was gefunden das dir die gesamte Row selektiert. Du musst dann nicht immer zwischen die Zeilen klicken.
Code:
// Mouse_Up Event des Grids
private void myGrid_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
	DataGrid.HitTestInfo hti = this.myGrid.HitTest(e.X, e.Y);
	if(hti.Type == DataGrid.HitTestType.Cell)
	{
		this.myGrid.CurrentCell = new DataGridCell(hti.Row, hti.Column);
		this.myGrid.Select(hti.Row);
	}
}
 
Zuletzt bearbeitet:
Danke für deine Hilfe...
Das mit den linien habe ich glöst, es wird jetzt ausgelöst wenn man auf nen Button klickt.

Aber auch nach mehrmaligem testen und umändern und bastel bekomme ich immer den Inhalt des ersten Zeile zurückgegeben. Als Spalte. ok, da soll es so sein, aber es ist halt auch egal in welche Zeile ich gehe. Könnte das evtl. an irgendwelchen Einstellungen am DataGrid liegen? oder am Button klicken bevor es startet?

Ich stell hier noch mal eben meinen derzeitigen Code rein:

Füllen des Grids:
Code:
public void ShowDB()
{
			
befehl = "Select NAME,TYPE,DESCRIPTION from OS_USER";
meinDataSet = managerObjekt.DBRead(befehl,"OS_USER");
int tableindex = meinDataSet.Tables.IndexOf("OS_USER");
myTable = meinDataSet.Tables[tableindex];
dataGrid1.SetDataBinding(meinDataSet, "OS_USER");
this.currencyManager = (CurrencyManager) this.dataGrid1.BindingContext[myTable];
meinDataSet.AcceptChanges();
}

Button Klick:

Code:
private void changeButton_Click(object sender, System.EventArgs e)
{
get_Names();
Change_User ChangeUserDialog = new Change_User();
ChangeUserDialog.ShowDialog();
}

get_Names():
Code:
public void get_Names()
{
Nameb = myTable.Rows[this.currencyManager.Position]["NAME"].ToString();
MessageBox.Show(Nameb, "NAME = ");
}

Args... ich hoffe, ihr könnt mir helfen, ich bin gerade voll am rotieren....

Meike
 
Hi,

wenn du
Code:
dataGrid1.SetDataBinding(meinDataSet, "OS_USER");
aufrufst, dann musst du auch den BindingContext ändern:
Code:
currencyManager = (CurrencyManager)this.dataGrid1.BindingContext[meinDataSet, "OS_USER"];
 
Hallo,

ich bin noch sehr unerfahren mit c# und probiere derzeit viel rum...

Ich hatte das Problem, dass ich (wie hier) auch durch anklicken eines Feldes in einem Datagrid mit z.B. einen Wert ausgeben lassen muss.

Das hat auch (dank diesen Beitrages) alle super geklappt.

Ein Problem hab ich jetzt aber leider noch...

Sobald ich die Daten in dem Datagrid sortiere (also oben auf die Leiste drücke, wo die Spaltennamen stehen), bekomme ich nicht mehr den richtigen Wert ausgegeben.

Er nimmt halt (wenn ich z.B. auf den ersten Eintrag drücke) immer auch aus der Tabelle den ersten eintrag - auch wenn nach dem Sortieren es eigentlich ein anderer wäre...

Könnt ihr mir da irgendwie weiter helfen?

(Danke schonmal im Voraus)

PS: da fällt mir gerade noch was anderes ein, was ich wohl später noch brauchen werde - aber auch überhaupt keine ahung habe, wie ich das machen soll:

würde da gerne noch eine TextBox einfügen, wo ich werte eingeben kann, um die DataGrid zu Filtern... was darüber noch jemand was weiß... ;)
 
Zuletzt bearbeitet:
hab noch etwas versucht... so geht es:

ID = dataGrid[dataGrid.CurrentCell.RowNumber, dataGrid.CurrentCell.ColumnNumber].ToString();
 
ich muss nun leider dieses alte thema doch wieder aufwärmen.

Ich habe folgendes Problem:

Datagrid ist normal und noch nicht geändert: alles funktioniert normal.
setze ich zum beispiel einen datensatz dazu über ein eigenes Formular bekomme ich immer den Datensatz angegeben, der ursprünglich an der stelle stand. hat irgendwer eine idee woran das liegen könnte?

hier mein code:

Delete Button

Code:
private void deleteButton_Click(object sender, System.EventArgs e)
		{
			get_Names();
			DeleteUserDialog = new Delete_User();
			m_TextManager.RegisterTextClient(DeleteUserDialog);
			DeleteUserDialog.ShowDialog();
			meinDataSet = managerObjekt.DBRead(befehl, "USER_INFO");
			dataGrid1.SetDataBinding(meinDataSet, "USER_INFO");
			this.currencyManager = (CurrencyManager) this.dataGrid1.BindingContext[meinDataSet, "USER_INFO"];
			meinDataSet.AcceptChanges();
			m_TextManager.UnregisterTextClient(DeleteUserDialog);
		}

GetNames:

Code:
public void get_Names()
		{
			dataGrid1.Refresh();
			this.currencyManager = (CurrencyManager) this.dataGrid1.BindingContext[meinDataSet, "USER_INFO"];
			Nameb = "";
			Nameb = myTable.Rows[this.currencyManager.Position]["NAME"].ToString();
			MessageBox.Show(Nameb, "Name:");
		}
 
Zurück