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?
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.
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
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 ...
ich habe ein ungebundenes DataGridView, dem ich lediglich Spalten hinzugefügt habe.
Der Nutzer kann dann seine Daten in die Zeilen eintragen.
Nun möchte ich die Daten als Objektliste einlesen, um anschließend speichern zu können.
Meine Frage ist, ob meine Lösung eine "gute" Lösung ist, oder ob es einen besseren Weg gibt?
List<MeineKlasse> list = new List<MeineKlasse>();
foreach (DataGridViewRow row in DataGridView1.Rows)
{
MeineKlasse obj = new MeineKlasse();
obj.id = (int)row.Cells["Id"].Value;
obj.Name = (string)row.Cells["Name"].Value;
...
list.Add(obj);
}
Entschuldige, aber irgendwie stehe ich auf dem Schlauch.
Habe die Abfrage nun wie folgt angepasst:
string q = @"SELECT
a.AnsprechpID AS AnsprechpartnerId,
a.Abteilung AS Abteilung,
a.Frau_Herr AS Anrede,
a.Email AS Email,
a.FaxNr AS FaxNr,
a.StandortId AS StandortId,
a.Nachname AS Nachname,
a.Vorname AS Vorname,
a.Titel AS Titel,
s.Firma_Standort AS Kunde
FROM tblansprechpartner a
LEFT JOIN tblstandort s ON a.StandortID = s.StandortID
WHERE (a.Nachname IS NOT NULL AND a.Nachname = @Nachname)";
Trotzdem erhalte ich weiterhin die Fehlermeldung??
ich rufe Daten aus der DB ab und binde diese an eine DataGridView. Klappt alles wunderbar.
public IEnumerable<Ansprechpartner> AlleAnsprechpartner()
{
using (IDbConnection db = new MySqlConnection(AppConnection.ConnectionString))
{
string q = @"SELECT
a.ID AS AnsprechpartnerId,
a.Abteilung AS Abteilung,
a.Email AS Email,
a.FaxNr AS FaxNr,
a.AdressId AS AdresseNr,
a.Nachname AS Nachname,
a.Vorname AS Vorname,
a.Titel AS Titel,
s.Firma AS Kunde
FROM tblansprechpartner a
LEFT JOIN tblstandort s ON a.AdressId = s.AdressId";
return db.Query<Ansprechpartner>(q, commandType: CommandType.Text);
}
}
...
var ansprechp = ansprechRepository.AlleAnsprechpartner().ToList();
SortableBindingList<Ansprechpartner> sort = new SortableBindingList<Ansprechpartner>(ansprechp);
dgUebersicht.DataSource = sort;
Nun möchte ich mit einer Textbox die Daten filtern:
var filteredList = ansprechRepository.AlleAnsprechpartner().Where(c => c.Nachname.ToString().Contains(textBox1.Text)).ToList();
Beim Filtern erhalte ich jedoch den Fehler:
Fehler
System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
Warum? Was ist falsch?
Kann es sein, weil ich als Tabelleneinträge bei Nachname auch null Werte habe?
Falls ja, wie kann ich das Problem lösen?
Ich habe es schon mit einer anderen Abfrage versucht, jedoch erhalte ich den selben Fehler:
string q = @"SELECT
a.AnsprechpID AS AnsprechpartnerId,
a.Abteilung AS Abteilung,
a.Frau_Herr AS Anrede,
a.Email AS Email,
a.FaxNr AS FaxNr,
a.StandortId AS StandortId,
a.Nachname AS Nachname,
a.Vorname AS Vorname,
a.Titel AS Titel,
s.Firma_Standort AS Kunde
FROM tblansprechpartner a
LEFT JOIN tblstandort s ON a.StandortID = s.StandortID
WHERE (a.Nachname IS NULL OR a.Nachname = @Nachname)";
Leider hat sich das Problem doch noch nicht erledigt.
Ich habe das UserControl versucht auf der TabPage einzufügen. Da erhalte ich die dann die Fehlermeldungen - siehe Bild.
Der Fehler tritt ja nicht erst beim Start des Programmes auf, sondern bereits im Designer.
Folgendes habe ich gefunden, was ich denke, auf mein Problem zutrifft.
Zitat
This problem can be caused if a class tries to get value of a key in web.config or app.config which is not present there.
Nun habe ich den Konstruktor des UserControl ohne Parameter erstellt.
Allerdings bekomme ich nun wieder bereits beim Hinzufügen auf die Form die folgende Fehlermeldung:
Anbei mal der Code:
Zitat
System.TypeInitializationException: Der Typeninitalisierer für Projektname.AppConnction hat eine Ausnahme verursacht.
Syste.NullReferneceException: Der Objektverweis wurde nicht aus eine Objektinstanz festgelegt.
Das hier ist meine AppConnection:
public static class AppConnection
{
public static string ConnectionString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
}
UserControl:
public partial class userControlKunde : UserControl
{
IKundeRepository kundeRepository;
public event DataGridViewCellEventHandler dg_CellDoubleClickEvent;
public userControlKunde()
{
InitializeComponent();
AufrufUebersicht();
}
private void userControlKunde_Load(object sender, EventArgs e)
{
this.dataGridView1.CellDoubleClick += dg_CellDoubleClickEvent;
}
void AufrufUebersicht()
{
kundeRepository = new KundeRepository();
var kndDaten = kundeRepository.AlleKundendaten().ToList();
dataGridView1.DataSource = kndDaten;
}
private void dg_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
dg_CellDoubleClickEvent?.Invoke(this.dataGridView1, e);
}
}
Form:
public partial class Form_Kunde : Form
{
userControlKunde uc = new userControlKunde ();
public Form_Kunde())
{
InitializeComponent();
AufrufKndUebersicht();
}
private void Form_Kunde_Load(object sender, EventArgs e)
{
uc.dg_CellDoubleClickEvent += new DataGridViewCellEventHandler(dataGridView1_CellDoubleClick);
}
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
MessageBox.Show("TETS");
}
...
ich habe ein UserControl erstellt und möchte dieses nun auf einer TabPage auf meiner Form einbinden.
Beim Hinzufügen über den Designer erhalte ich die Fehlermeldung
Zitat
"Fehler beim Erstellen der Komponente userControl1
System.MissingMethodException: Der Konstruktor für den Typ userControl1 wurde nicht gefunden.
...
Woran liegt das? Bzw. wie kann ich das Problem beheben?
@Th69 An welcher Stelle meinst du ToList()?
Versucht habe ich dgArtikel.DataSource = artikelRepository.AlleArtikel().ToList(); Dies lässt sich allerdings nicht sotieren.
So erhalte ich als Rückgabewert IEnumerable<Lager>.
Wenn ich dies direkt an eine DataGridView binde, kann ich anschließend nicht sortieren. Daher habe ich mir eine Methode
ToDataTable
erstellt, womit ich
die DataGridView wieder sortieren kann, was auch prima klappt - eigentlich.
Solange ich IEnumerable<T> direkt an die DataGridView gebunden hatte, konnte ich z.B. per Doppelklick einen Datensatz wie folgt aufrufen:
Artikel a = new Artikel();
private void dgArtikel_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex != -1)
{
a = dgArtikel.Rows[e.RowIndex].DataBoundItem as Artikel;
.....
}
}
Seitdem ich die Daten nun per DataTable binde, funktioniert der obige Aufruf nicht mehr.
Was kann ich machen, dass der obige Aufruf trotz Verwendung einer DataTable funktioniert?
um ein neues Projekt ordentlich zu gestalten arbeite ich mich nun in DApper und Repository pattern ein.
Das Abrufen der Daten von der DB hat auch schon prima geklappt.
Nun hänge ich beim Update.
public void UpdateArtikel(Artikel artikel)
{
using (IDbConnection db = new MySqlConnection(AppConnection.ConnectionString))
{
string q = @"UPDATE tblartikel SET Name = @Name WHERE Id = @Id";
if (db.State == ConnectionState.Closed)
db.Open();
db.ExecuteScalar<Artikel>(q, artikel);
}
throw new NotImplementedException();
}
@Abt danke für deine Hilfe!
Ich werde mich mal an die Überarbeitung machen ...
Zitat
- Daten in einem Rutsch holen, nicht in n
Verstehe zwar was du damit meinst, aber wie soll es in einem Rutsch gehen? Die Daten schon beim ersten Abruf mit übergeben?
Sonst kann ich doch nur zeilenweise prüfen?!
Hallo zusammen, ich fülle eine DataGridview und möchte anschließend zwei Spalten farbig markieren.
Soweit klappt das auch alles. Der Aufruf zum Laden/Anzeigen der Daten geht richtig schnell, nur die farbliche Markierung dauert recht lange (~10sek).
Nun wäre meine Frage, ob ein anderer Aufbau zu einer Verbesserung der Performance führt? Bzw. was ich ändern kann/soll?
dataGridView1.DataSource = dt;
Die farbliche Markierung:
void ColorGridView()
{
bool weKomplettAbgeschlossen = false;
bool weTeilweiseAbgeschlossen = false;
bool reKomplettAbgeschlossen = false;
bool reTeilweiseAbgeschlossen = false;
for (int n = 0; n < dataGridView1.Rows.Count; n++)
{
// Prüfen ob WEbereits komplett abgeschlossen wurde.
weKomplettAbgeschlossen = AufrufWE_Abgeschlossen_Pruefen(Convert.ToInt32(dataGridView1["id", n].Value));
if (!weKomplettAbgeschlossen)
{
weTeilweiseAbgeschlossen = AufrufWE_Erfolgt(Convert.ToInt32(dataGridView1["id", n].Value));
if (weTeilweiseAbgeschlossen)
{
dataGridView1["WEabgeschlossen", n].Style.BackColor = System.Drawing.Color.Yellow;
}
if (!weTeilweiseAbgeschlossen)
{
dataGridView1["WEabgeschlossen", n].Style.BackColor = System.Drawing.Color.Red;
}
}
if (weKomplettAbgeschlossen)
{
dataGridView1["WEabgeschlossen", n].Style.BackColor = System.Drawing.Color.Green;
}
// Prüfen RE komplett abgeschlossen.
reKomplettAbgeschlossen = AufrufRE_Abgeschlossen_Pruefen(Convert.ToInt32(dataGridView1["id", n].Value));
if (!reKomplettAbgeschlossen)
{
reTeilweiseAbgeschlossen = AufrufRE_Erfolgt(Convert.ToInt32(dataGridView1["id", n].Value));
if (reTeilweiseAbgeschlossen)
{
dataGridView1["REabgeschlossen", n].Style.BackColor = System.Drawing.Color.Yellow;
}
if (!reTeilweiseAbgeschlossen)
{
dataGridView1["REabgeschlossen", n].Style.BackColor = System.Drawing.Color.Red;
}
}
if (reKomplettAbgeschlossen)
{
dataGridView1["REabgeschlossen", n].Style.BackColor = System.Drawing.Color.Green;
}
}
}
Hier mal der Aufruf AufrufWE_Erfolgt:
public static bool AufrufWE_Erfolgt(int id)
{
try
{
using (entity ctx = new entity())
{
var query = (from w in ctx.tblwareneingang
where w.bestellId == id
select w).ToList();
if (query != null)
{
foreach (tblwareneingang we in query)
{
// falls abgeschlossen.
if (we.liefermengeAbgeschlossen)
return true;
else
// falls zumindest Eintrag existiert.
if (we.gelieferteMenge != 0)
return true;
}
return false;
}
else
return false;
}
}
catch (Exception ex)
{
return false; ;
}
}