das Stichwort, was du suchst heißt Closure, s.a.
> (unter dem gleichnamigen Kapitel "Closures").
Dass ist es danke
Zuerst mal Danke für die Antwort
Ich kann dir nur empfehlen den Code neuzuschreiben.
Das sieht alles sehr unschön und teilweise mit deinem umgebauten Code auch sehr gruselig aus.
Ist klar, es handelt sich hierbei wie gesagt um die verkürzte version.
Da deine Queue erst nach dem füllen abgearbeitet wird, ist in der anonymen Methode dann auch item eben das letzte Objekt in deiner Liste.
Du solltest ggf. deine Verarbeitung umstellen von einer anonymen Methode auf eine richtige Methode und übergibst dort einfach dein Item Objekt.
Dann hast du auch nicht solche komischen Nebenwirkungen und dein Code ist auch klarer.
ja mit var scheint es zu klappen.
Aber warum machst du es dir eigentlich nicht einfacher und startest einen extra Thread ....
War halt wirklich nur quick and dirty......
Dann bleibt deine UI auch nicht hängen.
Meine UI bleibt nich hängen ich benutze schon Invoke(), sieht man nur hier nicht.
Gruss
Hallo Forum
Ich habe vor kurzem ein Programm erstellt, dessen Funktion es sein sollte alle Verzeichnisse innerhalb eines Verzeichnisses mit dem 7-Zip-CommandLine-Tool zu packen. Für jedes Verzeichnis sollte ein Prozess gestartet werden um Ressourcen zu schonen sollte nichts parallel laufen. So schien es mir Plausibel eine Queue<Action> mit allen verzeichnissen zu erstellen und dann die Queue jeweils mit dem Process.Exited Event von 7-Zip.exe als Trigger abzuarbeiten.
In habe versucht den Code verkürzt darzustellen:
//QuellVerzeichnis
private string srcDir;
//ZielVerzeichnis
private string destDir;
//Verzeichnisliste
private List<String> DirectoryNames = new List<string>();
//Aktionen
private Queue<Action> ActionList = null;
private void ProcessDirectory()
{
if (!string.IsNullOrWhiteSpace(textBox1.Text)&&!string.IsNullOrWhiteSpace(textBox2.Text))
{
srcDir = textBox1.Text;
destDir = textBox2.Text;
}
else
{
return;
}
if (Directory.Exists(srcDir)&& Directory.Exists(destDir))
{
DirectoryNames.AddRange(Directory.EnumerateDirectories(srcDir));
///SIGNIFIKANTER BEREICH BEGINN
//Argumente
var args = " a -mx9 -bd \"{1}.7z\" \"{0}\\\" -scswin";
//Dateiname
var fname = @"C:\Program Files\7-Zip\7z.exe";
foreach (var item in DireDirectoryNames)
{
ActionList.Enqueue(() => {
var tmpstr = item;
ProcessStartInfo psinfo = new ProcessStartInfo();
psinfo.FileName = fname;
psinfo.Arguments = string.Format(args, tmpstr, tmpstr.Replace(srcDir, destDir));
Debug.WriteLine(psinfo.Arguments);
var p = new Process();
p.StartInfo = psinfo;
p.Start();
p.EnableRaisingEvents = true;
//SchleifenTrigger
p.Exited += (o, j) =>
{
GetNextProc();
};
});
}
//Erster Aufruf
GetNextProc();
///SIGNIFIKANTER BEREICH ENDE
}
}
void GetNextProc()
{
if (ActionList.Count > 0)
{
ActionList.Dequeue()();
}
else
{
MessageBox.Show("Finished");
}
}
Da ich die ARgument für 7-Zip vorher getestet hatte, war ich mir ziemlich sicher , dass alles reibungslos hätte funktionieren sollen, ich wurde jedoch eines anderen belehrt.
Das Programm lief zwar fehlerfrei durch, ich hatte jedoch am Ende immer nur einen Komprimierten Ordner im Zielverzeichnis und dieses hatte den Namen des letzte Verzeichnisses innerhalb des QUellverzeichnisses. Das hatte ich bisher nicht für möglich gehalten, warum auch?
Nach etwa einer Stunde kam ich durch Probieren auf die Lösung, Ich musste anstatt foreach eine for-schleife nehmen und zwar so:
//Argumente
var args = " a -mx9 -bd \"{1}.7z\" \"{0}\\\" -scswin";
//Dateiname
var fname = @"C:\Program Files\7-Zip\7z.exe";
for (int i = 0; i < (int i = 0; i < DirectoryNames.Count; i++).Count; i++)
var item = DirectoryNames[i];
....
Und dann lief das Programm korekt durch und verrichtete die gewünschte Arbeit.
Wie ihr seht ist das Problem jetzt ja schon gelöst nur nimmt es mich sehr Wunder wie diese Verhalten heisst und wo ich mehr darüber nachlesen kann. Ich war bisher der Meinung dass eine Anonyme Methode das Gleiche ist wie eine normale Methode und dass Variablen innerhalb des scopes neu erstellt werden insbesondere immutable-Typen wie Strings.( ALso warum bleibt die Referenz quasi auf item hängen?
Ich verwende in letzter Zeit des öfteren Queue<Action> ist es nicht Ratsam oder könnt ihr evtl. etwas Anderes für solche Zwecke empfehlen?
Ich hoffe, dass ich mich verständlich ausgedrückt habe.
hi
Ist ja klar object
besitzt ja keine solche Methode.
Imho sollte man hier besser dynamic
verwenden.
Hierzu denke ich dass man eigentlich mehr über die active-x komponente wissen sollte, wie sieht es denn mit einem Verweis auf die Typelib (Stichwort:tlbimp.exe
)aus?
Vielleicht kriegt man aus dieser ein Interface generiert dann ist das ja meistens (aber nicht immer) schon die halbe Miete.
Gruss
Hallo
Ist schon ein Bisschen her aber meines Wissens werden TableAdapter sowie TableAdapterManger - Klassen als
partial
angelegt, daher kann man dann so programmieren:
namespace WeineApp.deinDataSetTableAdapters {
public partial class TableAdapterManager
{
public void SetConnection(IDbConnection con)
{
this.Connection = con;
}
}
}
Gruss
Hoffe mein Feedback kommt für dich nicht zu spät...
Nein überhaupt nicht, habe mich auch mittlerweile dagegen entschieden, obwohl ich einen grossen Rabatt bekommen hätte.
Dank und Gruss
Balaban_S
Hallo
Da ich mir generell mit Einkauf von Fremdkomponeneten schwer tue, würde ich gerne wissen, ob jemand hier im Forum Erfahrungen mit den Syncfuison Tools sammeln konnte, da ich eine objektive Meinung über das Produkt brauchen würde.
Ein wichtiger Punkt wäre für mich zum Beispiel Stabilität im Desktopbetrieb.
Gruss
Balaban_S
Danach habe ich ACE mit JET ausgetauscht, doch dann kommt der Fehler:
Der 'Microsoft.JET.OLEDB.12.0'-Provider ist nicht auf dem lokalen Computer registriert.
Der Provider heisst :
Microsoft.Jet.OLEDB.4.0
siehe:
Connection strings for Excel
und
Connection strings for Excel 2007
Gruss
Balaban Senol
Nun ja, ich würde sagen, die Dateiendung ist OleDb ziemlich egal. Wenn du mit Sicherheit weisst, dass es eine Excel-Datei ist, spricht nichts dagegen, das mit OleDb anzusprechen. Natürlich stellt sich die Frage, ob jetzt ACE oder JET? Das solltest du schon noch herausfinden.
Zur zweiten Frage: Das hast du korrekt erfasst, dem DataSet ist es auch egal woher die Daten stammen, entscheidend ist der DataAdapter bzw. TableAdapter.
Gruss
Balaban_S
Coole Sache
Ich habe mal in einem Buch gelesen, wie man Assembler code als string in c++/cli on the fly kompiliert und von .net aus ausführt. Daher an sich nichts Neues, aber tolle Leistung 👍 Respekt.
Werd ich verfolgen.
Gruss
Ribbons dürfen aber nicht für Textverarbeitungs(-ähnliche)-Anwendungen mit kommerziellem Hintergrund verwendet werden.
Ok kann sein, habe noch nie ein Ribbon benutzt. Und ich gebe es zu, ich habe auch noch nie dieses Control verwendet.
EDIT: Kann man anscheinend auch im XP-Mode verwenden. Also ohne Ribbon.
Gruss
Kommt darauf an, ob dir z.Bsp. Tx Control Express reicht.
Gruss
Hallo Paladin007
Wenn es MS-Office ist, kannst du evtl. mit der ROT (Running Object Table) etwas anstellen. Hierbei ist es möglich lafaunde Prozesse via COM anzusprechen, wenn sie COM-Interop unterstützen.
such mal bei G nach c# running object table example".
Für andere Programme, z.Bsp. Works usw. könnte es schwieriger werden, dann ist wie schon beschrieben eine Lösung via FileSystemWatcher oder so machbar.
Gruss
Hallo Dux
Eine Lösung wäre z.Bsp. wenn du mit DataColumn.Expression-Eigenschaft arbeitest => dann kannst du direct mit einem Select die Gewünschten Daten erhalten.
Eine andere Lösung könnte sein, dass du bei der Erstellung des DataRow-Arrays
die DataRow.GetChildRows-Methode (DataRelation) verwendest.
Andere Lösungen z.Bsp. mit LinqToDataset nicht ausgeschlossen.
Gruss
Hi KST
Abgesehen davon, dass wahrscheinlich
AcceptChanges()
(Wo auch immer das für dich sinnvoll sein mag, ob jetzt im DataSet,DataTable oder in der DataRow) die Lösung für dein Problem ist, solltest du dir IMHO überlegen, warum du keine typisierten DataSets verwendest, das erledigt der TableAdapter dann nämlich selber.
Gruss
Balaban_S
Ich habe jetzt vorübergehend (auf) normales EF umgestellt und es klappt ohne Probleme. Zum Glück war es nichts grosses. Code First auf dem Desktop?
(momentan) Besser nicht 😉
Gruss
Balaban_S
Zuerst einmal vielen dank für die Antwort
Ok, das mit den EF Versionen werd ich überprüfen, die db hab ich mittlerweile gelöscht, somit kann es nicht (mehr) am connectionstring und der DB liegen.Und wo gibt es denn bei codefirst metadaten?
Das mit den Ressourcen schonen ist so eine Sache, da CE kein Verbindungspooling kennt und sowieso singleuseranwendung ist, erlaube ich mir nur einmal die Verbindung zu öffnen und beim Beenden zu schliessen.
Gruss
SqlCe.40 EntityFrameWork 4.3.1 Code first Windows.Forms
Hallo und frohe Ostern
Ich habe eine Anwendung bei der plötzlich die Fehlermeldung:
Fehlermeldung:
Der Typeninitialisierer für "System.Data.Entity.Internal.AppConfig" hat eine Ausnahme verursacht.
bei der initilaisierung des DBContextes auftaucht.
Bis vor kurzem funktionerte alles Wunderbar. Der Fehler kam aus dem Nichts.
Der Initialisierungscode:
StoreClientEntities db=new StoreClientEntities();
...
nichts weiter.
Zuerst arbeitete ich so:
StoreClientEntities db;
...
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
db = new StoreClientEntities();
...
}
Als dann nichts mehr ging und alle Debug-Haltepunkte übersprungen wurden wechselte ich zur oberen Version und erhielt dann eben die Fehlermeldung.
Hier noch die config:
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="StoreClientEntities"
connectionString="Data Source=|DataDirectory|\StoreClientEntities.sdf"
providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.4.0" />
<add name="Microsoft SQL Server Compact Data Provider 4.0"
invariant="System.Data.SqlServerCe.4.0"
description=".NET Framework Data Provider for Microsoft SQL Server Compact"
type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
</DbProviderFactories>
</system.data>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
Was kann dies verursachen?
Gruss
Hallo Peter
Ich würde nicht an die DataTable direkt Binden sondern an eine DataView zumindeset nach dem sortieren mit DataTableExtensions.AsDataView(T)-Methode (EnumerableRowCollection(T))
Hierbei kannst du mit Linq nach belieben sortieren. Natürlich solltest du dir die Sortierung merken.
Gruss
Hallo zusammen
@BerndFfm
.. SQL Server Compact (so heißt er inzwischen)..
🤔 Das "CE" bedeutet doch "Compact Edition" oder?
Ist ja eigentlich nur ne Abkürzung ich schreibe manchmal einfach nur SQLCE.
Gruss
Hallo Dimuwe
entweder verzichtest du in diesem Fall(nicht generell/nur als Workaround) auf Parameter und bildest das SQL mit einem StringBuilder oder so ODER du erstellst eine Temporäre Tabelle und speicherst deine Parameterliste dort um mit dem IN-statement darauf zugreifen zu können, denn Aufzählungen gehören nicht zu den vom SqlCeParametern akzeptierten SqlDbTypes.
Gruss
Balaban_S
Hallo
Wenn die ganze Zeile formatiert werden soll empfehle ich hierfür das **RowPrePaint **und zwar in dieser Form:
DataGridViewCellStyle CustomStyle = new DataGridViewCellStyle() { BackColor = Color.Yellow, ForeColor = Color.LightGray };
private void TheDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = TheDataGridView.Rows[e.RowIndex];
YourEntity ent = (YourEntity)row.DataBoundItem;
if (CheckVal(ent)/*bitte implementieren*/ )
{
row.DefaultCellStyle = CustomStyle;
}
}
}
EDIT://
Zu beachten ist, dass im Falle einer DataTable natürlich das **YourEntity **in eine **DataRowView ** gecasted werden sollte.
Gruss
Balaban_S
Hallo _pi
Ok ich gebe zu die quelle, die Ich verlinkt habe ist eine Ältere und bezieht sich noch auf VS2005. Mit VS2008 ist der TableAdapterManager hinzugekommen (hatte ich vollkommen vergessen), der wird per default erstellt. Somit kannst du diese Klasse erweitern ansprechen;
namespace DeinProjekt._pi_devDataSetTableAdapters
{
public partial class TableAdapterManager
{
public void SetConnection(ByteFX.Data.MySqlClient con)
{
_connection = con;
//Wenn TableAdapter vorhanden
if (_mitarbeiterTableAdapter!= null)
{
_mitarbeiterTableAdapter.Connection = con;
}
.
.
.
}
}
}
und im Konstruktor der Form
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var bldr = new MySqlConnectionStringBuilder ();
bldr.DataSource = "";
bldr.UserID = "";
bldr.Password = "";
bldr.Database = "";
tableAdapterManager.SetConnection(new MySqlConnection(bldr.ConnectionString));
}
Was du für ConnectionErrors zu erwarten hast musst du selbst wissen. Auf jeden Fall werfen die Adapter eine aussagekräftige **Exception(bzw. MySqlException) ** falls etwas nicht in Ordnung sein sollte und die kann man wie trashkid2000 schon geschrieben hat via try catch-Blöcke abfangen.
Gruss
Balaban_S
Ok
angepasst:
using ByteFX.Data.MySqlClient
using DeinProjekt._pi_devDataSetTableAdapters;
namespace DeinProjekt
{
public class mitarbeiterTableAdapterConnectionManager
{
public static MySqlConnection GetConnection(
mitarbeiterTableAdapteradapter)
{
return adapter.Connection;
}
public static void SetConnection(mitarbeiterTableAdapter adapter,
MySqlConnection connection)
{
adapter.Connection = connection;
}
}
}
Gruss
Balaban_s
Hallo _pi
...
Den Part den ich aber nicht verstehe, ist wie ich vorgehen muß, um den generierten ConnectionString ohne Passwort im Code zu verwenden
...
Dies ist ein anderes Thema und du solltest hierfür einen neuen Thread erstellen.
Zu deiner Frage.
Erstelle eine Klasse in der selben Assembly gemäss dem folgenden Beispiel:
using System.Data.SqlClient;
using NorthwindDataAccess.CustomersDataSetTableAdapters;
namespace NorthwindDataAccess
{
public class CustomersTableAdapterConnectionManager
{
public static SqlConnection GetConnection(
CustomersTableAdapter adapter)
{
return adapter.Connection;
}
public static void SetConnection(CustomersTableAdapter adapter,
SqlConnection connection)
{
adapter.Connection = connection;
}
}
}
Quelle:
Data Binding with Windows Forms 2.0: Programming Smart Client Data Applications with .NET
Von Brian Noyes
...............................................
Publisher: Addison Wesley Professional
Kapitel 2: Connection Management
Gruss
Balaban_S
Hallo
Wenn du Verweise gemäss Separate primäre Interopassemblys zum Erstellen und Ausführen von Projekten auf die Dateien in den enstprechenden Verzeichnissen:
%ProgramFiles%\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office12 (oder %Programme(x86)%\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office12 auf 64-Bit-Betriebssystemen) %Programme%\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14 (oder %Programme(x86)%\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office14 auf 64-Bit-Betriebssystemen)
hinzufügst und nicht über via Dialogfeld **Verweis hinzufügen **auf der Registerkarte COM sollte es funktionieren.
Gruss
Balaban_S
EDIT: Ich habe leider kein Office auf dem Laptop installiert und kann nicht mehr dazu sagen.
Hallo InSiDeR
Dies ist schon ein älteres bekanntes Problem und es gibt einige verschieden Lösungen dafür.
Hier nur ein paar Stichwörter und Links, welche IMO selbsterklärend sind:
*Primäre Interopassemblys in Office
*Gewusst wie: Zugreifen auf Office-Interop-Objekte mithilfe von Visual C# 2010-Funktionen (C#-Programmierhandbuch)
Gruss
Balaban_S
EDIT: Link korrigiert
Hallo Johnny B
Also so wie ich das sehe ist der Gruppenname, vorausgestzt die ID Spalte ist als Primärschlüssel festgestzt schon so verfügbar:
var ArtikelgruppeName =
(string)bestellungenDataSet.Produktgruppe.Rows.Find(ArtikelgruppeID)[1];
Die typisierte Variante bietet soweit ich weiss gleich automatisch .FindByID()
an wenn ID als Primärschlüssel definiert ist.
Gruss
Balaban_S
Hi Johnny B
Ich weiss nicht ob du ein typisiertes oder untypisiertes DatsSet verwendest
Ich schreib mal für beide Varianten.
/*Typisiert*/
BestellungenDataSet.ProduktgruppeRow row =
(BestellungenDataSet.ProduktgruppeRow)((DataRowView)comboBox1.SelectedItem/*EDIT:das hier war nicht korrekt*/).Row;
/*Untypisiert*/
DataRow row =
(DataRow)((DataRowView)comboBox1.SelectedItem/*EDIT:das hier war nicht korrekt*/).Row;
oder
/*Typisiert*/
BestellungenDataSet.ProduktgruppeRow row =
(BestellungenDataSet.Produktgruppe)((DataRowView)produktGruppeBindingSource.Current).Row;
/*Untypisiert*/
DataRow row =
(DataRow)((DataRowView)produktGruppeBindingSource.Current).Row;
und in jedem Fal dann
/*Typisiert*/
var ArtikelgruppeName = row.GruppenName;
/*Untypisiert*/
var ArtikelgruppeName = row[1].ToString();
Gruss
Balaban_S
Hallo
Nachdem ich das überdacht habe ergibt sich für mich folgende optimierte Herangehensweise.
private void TheDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (e.RowIndex >= 0)
{
DataGridViewRow row = TheDataGridView.Rows[e.RowIndex];
YourEntity ent = (YourEntity)row.DataBoundItem;
if (CheckDates(ent)/*bitte implementieren*/ )
{
row.Visible=false;
e.Handled=true;/*sehr wahrscheinlich besser*/
return;
}
if (CheckVal(ent)/*bitte implementieren*/ )
{
row.DefaultCellStyle = CustomStyle;
}
}
}
Eine Fortführung des Ganzen würde wahrscheinlich zu einer(oder mehreren) Erweiterungsmethode(n) für das DGV-Control führen welche delegaten und lambdas annimmt.
Interessant. 🤔
@Humsch: Dein Code färbt nur eine einzelne DataGridViewCell ein und nicht wie gewünscht die ganze Reihe/Zeile.
Gruss
Balaban_S
Hallo skelle
DataGridViewCellStyle CustomStyle = new DataGridViewCellStyle() { BackColor = Color.Yellow, ForeColor = Color.LightGray };
private void TheDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (e.RowIndex >= 0)
{
if (CheckVal(deineCollection[e.RowIndex].deinWert)/*bitte implementieren*/ )
{
for (int ix = 0; ix < TheDataGridView.ColumnCount; ix++)
{
TheDataGridView[ix, e.RowIndex].Style = CustomStyle;
}
}
}
}
für
alle Einträge, welche ausserhalb dieser Spanne liegen sollen ausgeblendet werden.
empfiehlt sich evtl. CollectionView Class ansonsten wenn möglich auf Bindingsource/DataTable ausweichen.
Gruss
Balaban_S
Hallo sharpType
Das macht man dann so wie in diesem Beitrag.
Kann man als bewährte Methode ansehen.
Gruss
Balaban_S
Hallo ludden
oder gleich Microsoft Jet OLE DB 4.0
siehe auch:
Connection strings for HTML Table
Gruss
Balaban_S
Hallo sharpType
Diese 2 Artkel sollten mehr Klarheit bringen.
Umgang mit 'DataAdapter'-Ereignissen (ADO.NET)
Using TableAdapters to Insert Related Data into an MS Access Database
(Beispiel in VB und mit TableAdaptern)
Grundsätzlich ist die Herangehensweise mit typisierten DataSets und TableAdaptern vorzuziehen, damit man nicht händisch die DataRelations erstellen muss.
MultipleActiveResultSets=True habe ich mit in der Verbindungszeichenfolge übergeben.
MultipleActiveResultSets auch bekannt als MARS gibt es erst seit MSSQL2005, eine Google-Suche kann dir da mehr Infos dazu liefern..
Gruss
Balaban_S
Hallo snupi
oder erledigt das mir das DataSet ?
Ganz genau. Du musst natürlich die Aktualisierungsweitergabe bei der Bezeiehung auf "Cascade" setzen und solltest einen TableAdapterManager benutzen und dann mit .UpdateAll() gleich das ganze DataSet aktualisieren.
Hierfür empfiehlt sich der Abschnitt Hierarchische Aktualisierung in der msdn-lib.
Gruss
Balaban_S
Hallo
ich denke, dass ich den Fehler gefunden habe und zwar hier:
ds = new DataSet(Table);
sollte:
ds = new DataSet();
ds.Tables.Add(Table);
sein.
Nachzulesen in der Dokumentation.
Hier die Links:*DataSet-Konstruktor
*DataTableCollection.Add-Methode (String)
Gruss
Balaban_S
Hallo Ho'nehe
Ich möchte noch etwas hinzufügen.
Commandbuilder ist fehl am Platz, der wird dir so oder so keinen Commands bilden , weil du 'JOIN's im query hast.
Ich denke du solltest dich in ADO.net einlesen, bevor du solch "komplexe" commands zusammenbastelst.
Gruss
Balaban_S
Hi IMGregor
Hi habe das zwar nie verwendet und kann nichts über die Qualität sagen aber Quartz.NET - Enterprise Job Scheduler for .NET Platform kommt mir da als erstes in den Sinn. Vielleicht hilft es dir ja weiter.
Gruss
Balaban_S
Hi med
Du könntest dir so etwas wie eine (oder mehrere) reine Datenklasse(n) bauen, welche die Daten enthält und dann dementsprechend reine "Arbeiter"-Klassen die mit den Daten arbeiten.
In Verbindung mit GUI bzw. Datenbindung kommen da viele Herangehensweisen in Frage, welche z.Bsp.(falls überhaupt vorhanden) von der View-/Model-Konstellation abhängig sind.
Hierfür sollte man mehr über die Problemstellung wissen.
Repository-Pattern könnte ein Stichwort hierfür sein.
Grus Balaban_S
Hallo AxelA
Nun das Prinzip des ADO.net-DataSets ist ja eigentlich, das die Daten "disconnected" von der Datenbank sind, wenn du die Daten aus fer Datenbank lädst sind sie im Arbeitspeicher hältst(siehe unbedingt DataSets, DataTables und DataViews (ADO.NET)).
Deswegen empfiehlt es sich unter Anderem:*Die Daten nur zu dann Laden, wenn sie benötigt werden. *Nur so viel Daten zu laden wie es zur Anzeige sinnvol ist z.Bsp durch Paging oder gleich Suchparamter an den Adapter zu übergeben um das Resultat einzuschränken.
In allen Fällen gilt jedoch, dass man nicht vorausssagen kann, wann der Garbagecollector aktiv wird und die Ressourcen freigeben wird.
Wenn du aber sicher weisst , dass die Grösse des Arbeitspeichers andere Prozesse beeinträchtigen wird und du alle oben genannten Möglichten schon ausgeschöpft haben solltest, kannst du schauen ob du mit der Process.MaxWorkingSet-Eigenschaft die maximal erlaubte Speichergrösse für den Prozess festlegen. Es sollte hierbei erwähnt werden, dass daraus aber wiederum andere Probleme resultieren können.
Gruss
Balaban_S
Nun ja
Erstens handelt es sich hierbei um eine komplett andere Frage.
Zweitens ist es auf mycsharp.de nicht üblich Komplettlösungen anzubieten siehe Wie poste ich richtig?.
Was deine Frage anbelangt (um sie dann doch nicht unbeantwortet zu lassen) würde eine mögliche Lösung so aussehen:
/// Durch diesen Button wird Aktion gestartet
private void button2_Click(object sender, EventArgs e)
{
/// Starte Timer
timer1.Start();
}
int AnzahlZeilen = dataGridView1.Rows.Count;
int i=0;
/// Timer Event
private void timer1_tick(object sender, EventArgs e)
{
/// Anzahl der Zeilen in der datagIrdView Liste
if(i<AnzahlZeilen)
{
// Auswahl der Zeile == true
dataGridView1.Rows[i].Selected = true;
MessageBox.Show("Bin gerade in Zeile: " + i);
// Auswahl der Zeile == false
dataGridView1.Rows[i].Selected = false;
i++;
}
else
{
/// stoppe Timer
timer1.Stop();
//Zähler wieder auf 0
i=0;
}
}
Gruss
Balaban_S
Ein HAMMER Bussi an dich!!!!!!!!
gern geschehen
Hast du oder jemand hiermit bereits Erfahrung gesammelt?
klar
probier mal:
// ds=das Das DataSet
DataTable dt = ds.Tables["List"];
DataRow dr = dt.NewRow();
dr["Name"]="Christian";
dr["Nachname"]="Merkel";
dr["Geschlecht"]="maennlich";
dr["Alter"]=2;
dr["Mutter"]="Melanie";
dr["Vater"]="Jürgen";
dr["Ort"]="Koeln";
dt.Rows.Add(dr);
Hierfür solltest du natürlich das DataSet als Property der entsprechenden Form definiert haben und für weiteres verweise ich unbedingt auf die Dokumentation von ADO.net.
Gruss
Balaban_S
Wo im Designer?
Klar
Helfen die Bilder weiter?
Hallo K.Karin
Ich denke du solltest sicherstellen, dass den Spalten auch die entsprechenden Prpoerties zugewiesen sind.
Im Designer >Spalten bearbeiten> dann entsprechender Spalte eben den Datapropertyname den Propertynamen zuweisen z.Bsp. "Alter".
Gruss
Balaban_S
Hallo Thomas.A
..
in dem ich über eine bool Variable die Entscheidung checked/unchecked entscheide und setze
..
Das kommt übrigens immer auf die zugrundeliegende Variable im Model an. CheckBox hat nicht wie allgemein angenommen 2 sondern 3 Zustände siehe:
CheckBox.Checked-Eigenschaft, CheckBox.CheckState-Eigenschaft, CheckBox.ThreeState-Eigenschaft
Im Übrigen würde ich sowieso Datenbindung empfehlen.
Gruss
Balaban_S
Hallo zusammen
..
Mußt Du nicht DataAdapter.Update() aufrufen
..
Ja und imo komplett ohne .AcceptChanges()
Gruss
Balaban_S
Hallo DaemNice
Hier bietet sich die
DataColumn.Expression-Eigenschaft (Abschnitt: ** Verweise auf Parent/Child-Beziehungen**) an
Oder aber auch die Vorgehnsweise von Juetho in DataGridView: Master/Detail über ComboBox.
Musst halt schauen, ob dir diese Funktionalität reicht. Ich persönlich finde beide Varianten ganz gut.
Gruss
Balaban_S