Laden...
T
tristar
myCSharp.de - Member
33
Themen
98
Beiträge
Letzte Aktivität
vor einem Jahr
Dabei seit
30.11.2016
Erstellt vor einem Jahr

Danke, das war der entscheidende Hinweis!

Nun klappt es - danke!

Erstellt vor einem Jahr

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.

Erstellt vor einem Jahr

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!

Erstellt vor 2 Jahren

@Th69 Danke, den Denkanstoß hab ich gebraucht 👍
Klappt nun prima!

Erstellt vor 2 Jahren

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?

Erstellt vor 2 Jahren

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?

Erstellt vor 2 Jahren

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;
            }
        }

Erstellt vor 2 Jahren

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!

Erstellt vor 2 Jahren

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?!

Erstellt vor 2 Jahren

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 ...