Danke, das war der entscheidende Hinweis!
Nun klappt es - danke!
So hatte ich es versucht bzw. verstehe auch deine Antwort:
ucDaten.cs
...
public event Action<Part> OnSelected;
...
private void btnTest_Click(object sender, EventArgs e)
{
Part part = GetTestObject("0815");
if (part!= null)
{
OnSelected?.Invoke(part);
}
}
FormStart.cs
ucDaten ucDaten = new ucDaten();
private void FormStart_Load(object sender, EventArgs e)
{
uc.OnPartSelected += OnPartSelected;
ucDaten.OnSelected += UcDaten_OnSelected;
}
private void UcDaten_OnSelected(Part obj)
{
// Aktion
}
Ist es so falsch umgestezt?
Die Aktion mit dem Buttonclick wird aufgerufen, danach passiert aber nichts mehr. Der Debugger sprint auch nicht auf die FormStart.
Hallo mal wieder,
ich habe eine Form mit einem TabControl. Auf der ersten TabPage erscheint eine Übersicht (ucUebersicht - basierend auf einem UserControl). Bei Auswahl einer Zeile wird ein weiteres UserControl (ucDaten) als neue TabPage erstellt.
Form.cs
...
ucUebersicht uc = new ucUebersicht(null);
...
public FormStart()
{
InitializeComponent();
AufrufUebersicht();
}
void AufrufUebersicht()
{
uc.Dock = DockStyle.Fill;
this.tabPageUebersicht.Controls.Add(uc);
}
private void FormStart_Load(object sender, EventArgs e)
{
uc.OnSelected += OnSelected;
}
private void OnSelected(Part p)
{
AufrufUcPart(p);
}
void AufrufUcPart(Part p)
{
try
{
System.Windows.Forms.Cursor.Current = Cursors.WaitCursor;
Control c = new UserControls.ucDaten(p);
if (p != null)
AddUserControls.AddControltoTabControl(tabControl, c, p.Nummer);
}
finally
{ System.Windows.Forms.Cursor.Current = Cursors.Default; }
}
ucUebersicht.cs
...
public event Action<Part> OnSelected;
...
private void dgUebersicht_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex != -1)
{
try
{
Cursor.Current = Cursors.WaitCursor;
part = dgUebersicht.Rows[e.RowIndex].DataBoundItem as Part;
if (part!= null)
{
OnSelected?.Invoke(part);
}
}
finally { Cursor.Current = Cursors.Default; }
}
}
Das funktioniert soweit auch alles prima.
Nun würde ich aber gerne aus dem UserControl ucDaten heraus durch eine Aktion eine weitere TabPage ucDaten öffnen - auf meiner FormStart, im TabControl.
Mein Problem dabei ist, wie kann ich aus diesem UserControl (ucDaten) heraus meine Form bzw. TabControl ansprechen, damit dann eine weitere TabPage angehängt wird? Bisher wird ja zunächst die Form geladen und die Übersicht angedockt und das UserControl ist der Form "bekannt".
Ich hoffe, ihr versteht mein Problem? Und danke schon mal für die Hilfe!
@Th69 Danke, den Denkanstoß hab ich gebraucht 👍
Klappt nun prima!
Ich habe es nun soweit hin bekommen, dass es läuft.
Nun habe ich aber innerhalb der DataGridView zwei Buttons, um die Positionen hoch und runter verschieben zu können.
void posIndexUp(DataGridView dg)
{
if (dg.SelectedCells.Count > 0)
{
int idx = dg.SelectedCells[0].OwningRow.Index;
if (idx > 0)
{
int col = dg.SelectedCells[0].OwningColumn.Index;
DataGridViewRowCollection rows = dg.Rows;
DataGridViewRow row = rows[idx];
rows.Remove(row);
rows.Insert(idx - 1, row);
dg.ClearSelection();
dg.Rows[idx - 1].Cells[col].Selected = true;
}
}
}
Das geht nun aber nicht mehr, da es datengebunden ist.
Was hätte ich hierzu für Möglichkeiten, um die Positionen verschieben zu können?
Hier mal ein Versuche.
private BindingList<Positionen> blPositionen;
void SpaltenAnzeigen()
{
blPositionen = new BindingList<Positionen>();
dataGridView1.DataSource = blPositionen;
}
void DatenUebernehmen
{
blPositionen.Add(new Positionen()
{
ArtikelNummer = comboBox1.Text
});
}
Weshalb werden keine Daten im DataGridView angezeigt?
Muss ich dazu erneut die
BindingList
als
DataSource
setzen?
Oder ist die Art der Umsetzung falsch?
Danke euch für Eure Hilfe!
Soweit bin ich bisher gekommen und funktioniert soweit.
private void OnTextChanged(object sender, EventArgs e)
{
string filter = cbx.Text;
lbxItems.Visible = false;
if (String.IsNullOrEmpty(filter)) return;
List<Baugruppe> lst = FilterBaugruppe(filter);
if (lst == null) return;
lbxItems.Items.Clear();
lbxItems.Items.AddRange(lst.ToArray());
lbxItems.DisplayMember = "NummerBezeichnung";
lbxItems.ValueMember = "Nummer";
lbxItems.Visible = true;
}
void OnMouseDoubleClick(object sender, MouseEventArgs e)
{
Baugruppe bg = lbxItems.SelectedItem as Baugruppe;
if (bg != null)
{
cbx.Text = bg.NummerBezeichnung;
lbxItems.Visible = false;
}
}
Es gibt aber noch ein paar Kleinigkeiten, wo ich Hilfe bräuchte:
// Ist es möglich (wahrscheinlich schon - nur wie?), den Teil aus dem OnMouseDoubleClick mit dem Keys.Enter Event
// als eine Methode zu schreiben, sonst habe ich doppelten Code.
private void cbNummer_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Down)
{
lbxItems.SelectedIndex = 0;
}
if (e.KeyCode == Keys.Enter)
{
Baugruppe bg = lbxItems.SelectedItem as Baugruppe;
if (bg != null)
{
cbx.Text = bg.NummerBezeichnung;
lbxItems.Visible = false;
}
}
}
Und der zweite Punkt:
Ich würde gerne mit den Pfeil-Tasten innerhalb der ListBox navigieren.
Hab folgendes versucht, aber das SelectedItem ändert sich nicht. Weshalb?
private void lbxItems_KeyDown(object sender, KeyEventArgs e)
{
this.lbxItems.Focus();
this.lbxItems.Select();
if (e.KeyCode == Keys.Up)
{
if (lbxItems.SelectedIndex > 0)
this.lbxItems.SelectedIndex--;
e.Handled = true;
}
else if (e.KeyCode == Keys.Down)
{
if (lbxItems.SelectedIndex < (lbxItems.Items.Count - 1))
this.lbxItems.SelectedIndex++;
e.Handled = true;
}
}
Hallo zusammen,
ich bräuchte mal wieder einen Ratschlag von Euch.
Ich überarbeite derzeit eine Windows Forms u.a. mit einer Combobox.
Leider besteht das Problem, dass beim
Form_Load
es recht lange (~ 7-8 Sek.) dauert, bis die Daten an die
ComboBox
gebunden sind.
Es sind derzeit ~ 10.500 Datensätze, Tendenz steigend.
Ein Abruf der Daten über eine separate Form ist nicht möglich, da die Nutzer weiterhin mit einer ComboBox arbeiten möchten.
Selbst wenn ich beim Laden der Daten ein Limit setze, dann muss ich ja sobald der Nutzer einen Wert auswählen möchte, die restlichen Daten laden, was dann dauert.
Das Ändern der Reihenfolge,
.DisplayMember
,
ValueMember
und die
DataSource
, um ein Re-Loading der internal List zu vermeiden, hat keinen Effekt.
Was habe ich dann für Möglichkeiten?
Danke!
Hallo,
folgende Ausgangssituation:
Ich habe eine Übersicht und für diese verwende ich eine DataGridView und eine Textbox, um zu filtern.
Diese Übersicht soll in verschiedenen Bereichen angezeigt werden können und je nach Bereich ein anderes Event (beim Doppelclick auf die DataGridView) ausgeführt werden.
Event würde etwa bedeuten => Daten übergeben, neue TabPage mit Controls hinzufügen => weitere Events ...
Was ist der richtige Weg der Umsetzung dafür?
a) Erstelle ich die Übersicht als UserControl?
b) Erstelle ich eine Form und rufe je nach Bereich dann das entsprechende Event auf?
c) Das Event (Datenübergeben, AddTabPage ...) als eigenes UserControl?
d) eine andere Lösung
Ich hoffe, dass meine Frage verständlich ist?!
Tut mir leid, wenn ich es noch nicht ganz verstanden habe.
Ich kann zwar eine Zeile zur DataTable hinzufügen und auch als Objekt speichern. Das aber nur, wenn ich die Daten z.B. über eine Textbox an die DataGridView übergebe und einfüge.
Meine Frage ist, wie ich es hinzufügen kann, wenn die Daten direkt in die DataGridView eingetragen werden?
Wenn ich bereits eine Liste binde, dann kann der Nutzer direkt nichts ändern ...