Laden...

Forenbeiträge von Talon Ingesamt 67 Beiträge

04.01.2016 - 14:07 Uhr

Ein kleiner Nachtrag zum Thema.
Ich würde das ganze in eine extra Methode packen. Dadurch hast Du deine Aktion, in deinem Fall das laden einer URL, zentral an einer einzigen Stelle im Quellcode. Solltest Du die URL ändern wollen musst Du das nur noch an einer Stelle im Quellcode und nicht an verschieden. Das reduziert mögliche Fehlerquellen.


public MainPage()
{
         this.InitializeComponent();
         openURL();
}

private void goNavigateButton_Click(object sender, RoutedEventArgs e)
{
         openURL();
}

private void openURL()
{
         //load URL
}

01.12.2015 - 12:08 Uhr
if (s.Trim() != "")  

wäre aber !String.IsNullOrWhiteSpace 😉

Mein Fehler. 🙂

30.11.2015 - 14:42 Uhr

Wie Abt schon schreibt genügt ein einzelner Punkt für dein Split.

Worauf ich noch hinweisen möchte ist das fehlende Error handling. Ich kann nicht sagen ob dein Lehrer/Prof darauf keinen Wert legt aber meiner Meinung nach gehört so etwas zwingend mit dazu. Ein paar einfache Überprüfungen schaden nicht.

Zum Beispiel kann man nach dem Split prüfen ob das Array die Größe 3 hat.

Du verwendest in deinem Code

if (s.Trim() != "")

Das ist schlechter Stil. Hier bietet sich String.IsNullOrEmpty an.

Was passiert wenn der übergebene String keine Zahl ist? Dann fliegt dir ConvertToInt um die Ohren. Hier wäre Int32.TryParse die bessere Wahl.

04.11.2015 - 12:07 Uhr

Wie genau willst Du die Einzeltelegramme später weiter verarbeiten? Einfach der Reihe nach oder gezielter Zugriff auf einzelne Telegramme?

Wenn Du die eingehenden Telegramme später nur der Reihe nach abarbeiten willst brauchst Du dir keine Gedanken um Variablennamen zur Laufzeit und ähnliches machen.

Ein kleiner Denkansatz wie Du das z.B. lösen könntest

 List<einzeltelegramm> lstET = new List<einzeltelegramm>();
einzeltelegramm ET = null;

for (int i = 0; i < 1000; i++)
{   //Beispiel 1000 Instanzen
    ET = new einzeltelegramm(daten);
    lstET.Add(ET);
}

04.11.2015 - 07:51 Uhr

Das sind alles Dinge die Du bereits durch deinen C Kurs kennen und auch lösen können solltest.

Ich würde Dir erst einmal ein paar Grundlagenübungen empfehlen. Das beantwortet automatisch alle deine bisherigen Fragen.
Visual C# 2012 aus der Sammlung Openbooks des Rheinwerk Verlags.
C# Tutorials
Visual C# Videos

23.09.2015 - 14:22 Uhr

Ich befülle ein DGV - Zeilenweise mit Daten aus MySQL Tabellen (Kein DataSet etc.
hat seine Gründe!)

Na der interessiert mich jetzt aber. Mit einem DataSet/DataTable könntest Du im Programm z.B. mit LINQ arbeiten.

24.08.2015 - 07:56 Uhr

Es wird erst einmal gesagt, dass man mit && bzw. || Ausdrücke verknüpfen kann. Sind bei && beide Ausdrücke wahr, ist das Ergebnis ebenfalls war. Ist bei || einer der beiden Ausdrücke wahr, ist das Ergebnis ebenfalls wahr. Das verstehe ich und ist logisch.
-> Irgendwie habe ich da noch ein Problem mit, ich glaube, dass ich dort irgendwo noch etwas falsch nachvollziehe 😄 Über weitere Hilfe (gerne an einem eigenen Beispiel) wäre ich dankbar! 😃

Vielleicht hilft dir das weiter.
&& Operator (C# Reference) und || Operator (C# Reference).

27.10.2014 - 08:32 Uhr

Meiner Meinung nach viel zu kompliziert gedacht. Bei nur 2 Tabellen musst Du keine "wilden" JOIN Konstrukte bauen. Das geht auch deutlich einfacher.
Hier ein Beispiel wie dein geschildertes Problem umgesetzt werden könnte.


SELECT *
FROM Triggers AS t, Triggers_Done AS d
WHERE t.OID = d.Trigger_ID AND NOT d.Username = '123'

Das würde dir aus beiden Tabellen alle verknüpften Datensätze zurück liefern deren Username in Triggers_Done nicht 123 ist.

15.09.2014 - 10:05 Uhr

Zugegeben. Das Beispiel von dN!3L sieht schickt aus. Deutlich ansprechender wie eine 0815 MessageBox.

Aber mal ernsthaft. Der Aufwand für die Umsetzung ist doch deutlich höher verglichen mit einer schlichten MessageBox.

Im konkreten Fall muss man mit der Hintergrundfarbe des Panel herum spielen, es muss ein Text und ein Icon angezeigt werden und natürlich muss alles wieder rückgängig gemacht werden wenn es korrigiert wurde.
Bleibt noch die Frage wann dN!3L die optische Information einblendet. Erst wenn der Nutzer auf speichern klickt oder doch schon während der Eingabe? Muss der Nutzer dann noch einmal auf speichern klicken wenn er die vorhandene Abfrage überschreiben will? Ist das nicht etwas verwirrend? Im Hintergrund muss man das ja alles aus programmieren mit dem "ja Nutzer will überschreiben" usw.

Da ist mir eine MessageBox mit MessageBoxButtons.OKCancel deutlich lieber. Das ganze erschlage ich mit deutlich weniger Codezeilen und der Nutzer ist sich ohne weitere Beschreibung im klaren "Abbruch" bricht das speichern ab und er kann einen anderen Namen eintragen.

01.09.2014 - 09:55 Uhr

Zum lokalen speichern von Daten kann ich SQLite empfehlen. Das ganze ist eine Serverlose SQL Datenbank. Man muss also nicht erst groß irgendwelche SQL Server einrichten.

28.08.2014 - 15:01 Uhr

Das mit der zwischen Tabelle habe ich nicht ganz verstanden. Könntest du das bitte noch ein bisschen näher erklären? Vielleicht solltest Du dich erst einmal mit den Grundlagen des Datenbank Designs beschäftigen.
Relationale Datenbank
Normalisierung
ER Modell

11.08.2014 - 14:05 Uhr

DataTable.Select-Methode

Nutzt das heutzutage keiner mehr?

06.08.2014 - 07:59 Uhr

Ich wollte es eigentl vermeiden eine Datenbank zu benutzen.
Da es ein kleines Programm ist. SQLite. Klein, kompakt & benötigt keinen Server. Nach außen hin ist es "nur" eine Datei.

29.07.2014 - 07:45 Uhr

Geht es irgendwie, dass ich diese DLLs nur in meine Toolsammlung integriere und darüber dann an die letztendlichen Projekte weiterreichen kann?

Natürlich geht das. Wieso auch nicht. Es ist allerdings die Frage ob es Sinnvoll ist alles in eine "eierlegende Wollmilchsau" zu packen.
Ich persönlich erstelle mir für jede solcher DLLs einzelne Wrapper die ich dann bei Bedarf in das jeweilige Projekt einbinde.
Das gilt übrigens auch für eine "Tool Sammlung". Auch hier sollte man Sinnvoll nach Bereichen trennen und entsprechend einzelne Projekte erstellen.

11.07.2014 - 11:38 Uhr

Nur ist es so, dass ich nicht die MainTable-Update sondern eine auf die das JOIN zugreift - Funktioniert das trotzdem so einfach wenn ich dann die ID habe? Muss diese als PK definiert sein oder reicht es wenns so eindeutig ist?

Hast Du jetzt in jeder Tabelle in deiner Datenbank eine eindeutige ID oder nicht? Es spielt dabei ja keine Rolle ob es eine extra ID Spalte ist oder eine Kombination aus verschiedenen Spalten. Wichtig ist nur die Eindeutigkeit.

Ich hoffe mal das ich dich richtig verstanden habe.

Du holst also mittels JOIN aus verschiedenen Tabellen Informationen in ein GridView.
Jetzt willst Du eine bestimmte Information in eine bestimmte Tabelle deiner DB zurück schreiben.

Dann frage ich mich wo ist das Problem? Es gibt nur 2 Möglichkeiten.
Hast Du die eindeutige ID des Datensatzes aus der gewünschten Tabelle mach deinen Update. Das ist kein Hexenwerk.
Wenn diese ID in deinem GridView allerdings nicht vorliegt wirst du auch kein Update machen können. Du bzw. den SQL Statement weiß ohne die eindeutige ID ja nicht wohin mit den Informationen.

10.07.2014 - 07:32 Uhr

Wenn ich das ganze alphabetisch sortiere zerstöre ich damit erstmal die ganze Logik. Welche Logik? A1Q1 ist in deinem Fall ja auch Q1A1. Egal wie herum Du das sortierst. Der "Spieler" kann auf seiner Hand auch jederzeit die Kartenreihenfolge wechseln ohne das sich seine Hand dadurch ändert.
...Natürlich könnte man das ganze danach wiederherstellen... Was überhaupt keinen Sinn ergeben würde (siehe oben).
...Um die nervösen Moderatoren zu beruhigen, wenn man mir ein Codesnippet als Hilfe anbietet... Die Beiträge hier sind als Denkanstoß zu verstehen. Hier zeigt man dir normalerweise nur die Richtung. Den Rest musst Du dir schon selbst erarbeiten. Nur so wirst Du auch verstehen was Du da gerade machst.

Zurück zum Thema.
Ich persönlich wurde deine Liste erst einmal sortieren (wie bereits weiter oben vorgeschlagen) und das ganze dann in ein Hashtable oder eine Sorted List packen.
Da Du ja nur jeweils 2 Karten in Kombination hast bietet sich das an.

12.06.2014 - 12:45 Uhr

Dein "Speichern" oben macht irgendwie nichts.
Du öffnest zwar den SaveFileDialog aber das war es dann auch schon. Zumindest ist in deinem schlecht formatierten Codeschnipsel nicht wirklich mehr.

Deine erste if Anweisung läuft völlig ins leere (wohl beim Copy & paste eines Beispielcodes zu viel raus gelöscht?)
Danach füllst Du zwar deine SortedList aber was dann? Weiter machst Du hier nichts. Wo genau soll dein Code deine SortedList als Textdatei speichern oder hast Du das absichtlich nicht geposted?

Übrigens empfinde ich es als schlechten Programmierstil eine SortedList ohne Key & Valuetypen zu deklarieren. Dazu kommt noch, dass Du ungeprüft Werte in selbige schreibst. Wenn Du einen bereits vorhandenen Schlüssel noch mal hinzu fügst fliegt dir das ganze mit einer Exception um die Ohren.

Wie weit kommst Du im Code? Debugger? Irgendwo muss ja das eigentliche "speichern" in deinem Code sein sonst würde dein Programm ja keine Textdatei erstellen. Mit dem Debugger würdest Du erkennen wieso dein Programm beim "Speichern_Click" eben nicht das macht was Du erwartest.

Für mich sieht das alles sehr nach fehlenden Grundlagen aus.

08.05.2014 - 16:00 Uhr

Versuch es einmal mit Timestamp.

07.05.2014 - 09:49 Uhr

Schon mal bei den Firmen direkt angefragt? Die beißen nicht.

25.04.2014 - 07:02 Uhr

Ich verstehe nicht ganz wo das Problem liegt? 1mal das Projekt für deine Klasse erstellen und dieses dann einfach einbinden. VS erstellt beim kompilieren die DLL von selbst und Du kannst deine eingebundene Klasse weiter bearbeiten.

08.04.2014 - 12:34 Uhr

Ich muss mit einer ACCESS Datenbank arbeiten. Du weisst ja...
Alles muss perfekt funktionieren darf aber nix kosten 😃

Dann nimm doch SQLite. Kostet nichts und Du hast eine vernünftige Datenbank.

11.03.2014 - 12:33 Uhr

...ich werde versuchen den VolumeName als Array zu speichern und zu vergleichen...

Bevor Du nun hier mit der Kirche ums Dorf baust.
Gewusst wie: Überwachen eines Ausdrucks im Debugger
Du musst nichts irgendwie irgendwo speichern. Setze dir nach

DriveInfo[] allDrives = DriveInfo.GetDrives()

einfach einen Haltepunkt und sehe dir die Variable bzw. deren Inhalt in der Überwachung an.

11.03.2014 - 09:50 Uhr

Fehlermeldung:
"System.IO.IOException, {"Das Gerät ist nicht bereit.\r\n"}"

Das lässt sich vermeiden indem Du deinen gesamten Code in dein

if(d.IsReady) { /*Anweisungen*/ }

packst und nicht nur deine Consolenausgabe.

Hast Du denn schon mal nachgesehen was dir

d.VolumeLabel

als Wert zurück liefert? Vielleicht entspricht das VolumeLabel nicht deinem erwarteten Anzeigenamen.

07.03.2014 - 08:26 Uhr

Um solche Probleme von vornherein zu vermeiden verwende ich bei meinen Tabellen für Schlüsselfelder immer die Kürzel PK (primary key) bzw. FK (foreign key). In deinem Fall hätte ich also die Schlüsselspalten PK_meta_id & FK_meta_id genannt. So hast Du anschließend auch kein Problem wenn Du mal schnell einen SQL mit SELECT * los lässt.

Allerdings muss ich FZelle zustimmen, dass man qualifizierte SQL Syntax verwenden sollte. SELECT * ist quick and dirty und nur zu gebrauchen wenn man kurz etwas testen will.

28.02.2014 - 14:39 Uhr

Mit einer foreach Schleife durch alle Zeilen deines Datatable. Einfach die Spalte mit der Mailadresse auslesen und weg schreiben.
Hat es einen besonderen Grund wieso es unbedingt ein String Array sein muss? Ein List<T> wäre hier meiner Meinung nach besser.

24.02.2014 - 10:38 Uhr

Dennoch die Frage: Warum beim SELECT erst?
Wurde denn beim INSERT die Limitierung auf VARCHAR(100) missachtet und der überlange Name geschrieben? Entsteht das Limit erst dadurch das die DB Typisierung dem Anfragenden (.Net DataTable) diese info gibt und dort dann der Fehler entsteht, dadurch das der überlange Name aus der DB in die DT geladen wird?

Ein einfacher Test ohne diesen überlangen Datensatz könnte dir deine Frage beantworten. Kommt man heutzutage nicht selbst auf solche einfachen Ideen? Das würde dir sofort zeigen ob dein Code soweit funktioniert.

19.02.2014 - 15:17 Uhr

In SQLite erstellst Du Tabellen praktisch auf die gleiche weise wie in anderen Datenbanken.
Mit der Datenbankdatei verbinden und einfach Tabellen erstellen.
Hier eine Übersicht von Befehlen die von SQLite verstanden werden.

Vielleicht hilft es wenn Du dir erst mal in Ruhe die SQLite Seite etwas durchstöberst. Das sollte an sich die meisten deiner Fragen beantworten.

19.02.2014 - 14:26 Uhr

Aber wie? System.Data.SQLite
Der Rest ist dann das übliche. Connection, DataAdapter, Command....

11.10.2013 - 12:40 Uhr

Weil Du erst eine weitere Spalte anfügen musst. Ich persönlich würde das ganze allerdings über ein Datatable lösen.

/Nachtrag:
DataGridView
Es würde dir viel helfen dich erst einmal mit dem DataGridView zu beschäftigen.

02.09.2013 - 12:05 Uhr

Zuerst einmal solltest Du dir angewöhnen deinen Code sauber zu formatieren. Selbst bei den paar Zeilen Code tut man sich schon schwer das zu lesen.
Was Du da gebaut hast ergibt keinen Sinn. Eine foreach Schleife mit der Du alle Tabs durchläufst um dann darin noch mal in einer for Schleife alle Tabs durch zugehen. Beziehst dich darin dann aber auf die foreach Schleife. Das kann nur krachen.

02.09.2013 - 07:50 Uhr

Ich stand neulich vor einem ähnlichen Problem. Nach etwas Recherche im Netz habe ich mich dann gegen einen Dienst entschieden und mich für den Windows Taskscheduler (Aufgabenplanung) entschieden.
Statt eines Dienstes habe ich eine normale Anwendung (ohne GUI) mit Setting geschrieben.
Unter Verwendung des Scheduler kannst Du vermutlich einen Großteil deines Programms unverändert weiter nutzen. Zusätzlich bietet der Scheduler eine Überwachung mit an und kümmert sich bei Problemen um das beenden und neu starten deiner Anwendung.

17.07.2013 - 12:32 Uhr

Danke für die Antworten. Ich hatte so etwas befürchtet.

17.07.2013 - 11:50 Uhr

Hallo zusammen. Ich habe eine ganz banale Frage.
Gibt es zufällig einen eleganteren Weg das letzte Zeichen eines Strings in einen Großbuchstaben zu konvertieren?


string strTEST = "x1Q23548a9131r86e6431S53z54781x";
strTEST = strTEST.Remove(strTEST.Length - 1) + strTEST.Substring(strTEST.Length - 1).ToUpper();

Vielleicht liegt es nur an mir aber ich finde das Konstrukt nicht schön. Für den ersten Buchstaben gibt es ja brauchbare Lösungen wie z.B.


strTEST = System.Globalization.TextInfo.ToTitleCase(strTEST);

30.05.2013 - 11:09 Uhr

Nun möchte ich Form 2 wieder schliessen. Wenn ich das so mache:

private void Pr_CancelButton_Click(object sender, EventArgs e)  
    {  
       this.Close();  
    }  

Steht dieser Code denn in deiner Form 2? Nur so aus Neugier, denn an sich stimmt das so.

23.04.2013 - 08:23 Uhr

Das mit der ID ist so eine Sache.
Was ist z.B., wenn ein Eintrag editiert wurde? Alte ID mit neuem Inhalt. Würde in dem Fall völlig untergehen. Nur um mal ein Beispiel zu nennen.
Um sicher zu gehen wirklich alle neuen und geänderten Einträge zu bekommen, und nur diese, bleibt Dir nur mit einem Timestamp zu arbeiten.

18.04.2013 - 13:36 Uhr

GIS
GiS RFID-Systeme > 125 kHz Systeme > TS-ML138 / TS-MK138
Mit deren Hardware habe ich schon gearbeitet. Allerdings gibt es nur eine VC6 DLL um deren Geräte anzusprechen. Müsste im Preisrahmen liegen.

09.10.2012 - 07:44 Uhr

Nicht wirklich eine Antwort auf deine Frage aber vielleicht ein Lösungsansatz.

Ich binde an meine DataGridViews immer ein DataTable als Source.
Wenn Du nun nach CheckBoxen filtern willst geht das relativ einfach. Ist dein Table typisiert kannst Du direkt auf TRUE filtern. Wenn nicht sollte die Spalte Standard vom Typ String sein. Dann genügt es den Wert vorher zum Boolean zu konvertieren und schon kannst Du wieder auf TRUE filtern.

Bsp:

foreach (DataRow r in dt.Rows)
     if(r["CheckBox"] == true)
     //oder
     if(Convert.ToBoolean(r["CheckBox"]) == true)
          //do something
09.10.2012 - 07:18 Uhr

Danke an alle für die Empfehlungen. Ich habe mich für SQLite entschieden.

18.09.2012 - 20:11 Uhr

Hallo zusammen. Ich bin auf der Suche nach einer mobilen Datenbank in der Messwerte erfasst werden sollen. Um genau zu sein sind es ca. 260 unterschiedliche Messwerte.

Zuerst dachte ich an Access da die ganze Anwendung "Out of the Box" ohne Installation laufen muss. Allerdings kann Access die Menge an Spalten nicht verarbeiten. Auf meiner Suche nach einer Lösung habe ich bisher immer nur hinweise auf DB Server Installationen gefunden. Das kommt leider im konkreten Fall nicht in Frage.

Hatte schon einmal jemand so ein Problem? Welche DB könntet ihr für so einen Fall empfehlen?

Anforderungen:

  • Die DB muss zwingend mobil sein.
  • Tabellen müssen mit mindestens 260 Spalten zurecht kommen (besser 300)
  • Open Source oder Free Ware wäre nett aber kein muss.

Danke für eure Empfehlungen.

23.09.2011 - 08:54 Uhr

Wenn Du aus deinem Gridview eine ID hast, kannst Du damit über Select im Table suchen.

DataRow[] foundRow = DataTable.Select("<Suchfeld> = '" + <Wert> + "'");
20.06.2011 - 10:24 Uhr

Wie wäre es als Alternative das Textfile über FileStream & StreamReader auszulesen?

14.06.2011 - 12:32 Uhr

Du kannst mehrere Tabellen auch in einer CSV Datei unterbringen. Du musst diese nur entsprechend Kennzeichnen.

Zum Beispiel:


\*tabelle_1_start*
temp;150;300;400;600;.....
200;xxx;xxx;xxx;xxx;....
300;xxx;xxx;xxx;xxx;....
400;xxx;xxx;xxx;xxx;....
.
.
.
\*tabelle_1_ende*
\*tabelle_2_start*
temp;150;300;400;600;.....
200;xxx;xxx;xxx;xxx;....
300;xxx;xxx;xxx;xxx;....
400;xxx;xxx;xxx;xxx;....
.
.
.
\*tabelle_2_ende*
\*tabelle_3_start*
temp;150;300;400;600;.....
200;xxx;xxx;xxx;xxx;....
300;xxx;xxx;xxx;xxx;....
400;xxx;xxx;xxx;xxx;....
.
.
.
\*tabelle_3_ende*
...

Die eingelesene CSV kannst Du dann entsprechend filtern und zerlegen. Nach belieben in z.B. Datatables packen und weiter verarbeiten.

Die Frage ist allerdings wieso Du nicht direkt die Excel Tabellen ausliest und damit arbeitest? Gibt es einen Grund dafür aus dem Excel erst eine Textdatei zu erstellen?

14.06.2011 - 08:44 Uhr

Ich muss Daten in eine bestehende Excel Liste schreiben. Das klappte bisher auch wunderbar. Bis vor ein paar Tagen.
Seit kurzem kann es vor kommen das "längere" Texte gespeichert werden müssen. Mein Problem ist, dass ich über meine OleDb Command keine Strings mit z.B. 300 Zeichen Länge in die Excel Zelle schreiben kann. Als Fehlermeldung erhalte ich bei com.ExecuteNonQuery():
"Das Feld ist zu klein für die Datenmenge, die Sie hinzufügen wollten. Versuchen Sie, weniger Daten einzufügen."


public void UpdateExcelRow(string strExcelPath, string strExcelSheet, Boolean bHeader, string strUpdateExcel, string strExcelColumnSearchName, string strSearchValue, string errorFilePath)
             string con = "Data Source=" + strExcelPath + ";Mode=ReadWrite;Provider=Microsoft.Jet.OLEDB.4.0;";
            if (bHeader)
                con += @"Extended Properties=""Excel 8.0;HDR=Yes""";
            else
                con += @"Extended Properties=""Excel 8.0;HDR=No""";
            try
            {
                DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");
                using (DbConnection dbcon = factory.CreateConnection())
                {
                    dbcon.ConnectionString = con;
                    using (DbCommand com = dbcon.CreateCommand())
                    {
                        strExcelSheet += "$";
                        string strCom = "UPDATE [" + strExcelSheet + "] SET "
                            + strUpdateExcel
                            + "WHERE " + strExcelColumnSearchName + " = '" + strSearchValue + "'";
                        com.CommandText = strCom;
                        dbcon.Open();
                        com.ExecuteNonQuery();
                        dbcon.Close();
                    }
                }
            }
            catch (OleDbException e)
            {
                writeError(e.Message, errorFilePath);
            }
}

Jemand eine Idee woran das liegen könnte? Danke

05.04.2011 - 12:33 Uhr

die Frage "Warum erstellst du per NewRow eine Zeile und benutzt diese dann nicht?" verstehe ich leider nicht, da ich die Row hier nutze (fett markiert) um meine Daten zu übergeben. Das klappt auch einwandfrei

_ DataRow row = uebergabe.NewRow();
row["Vorname"] = Vorname;
row["Nachname"] = Nachname;_
uebergabe.Rows.Add(row["Vorname"], row["Nachname"])

Hinzufügen neuer Zeilen sollte an sich so aussehen:

DataRow row = tabelle.NewRow();
row["Spalte1"] = "wert";
row["Spalte2"] = "wert";
tabelle.Rows.Add(row);

Zu deinem Problem mit den Checkboxen im GridView. Bist Du dir sicher, dass Du "ReadOnly" auf FALSE gesetzt hast?

11.01.2011 - 08:47 Uhr

@TomLeech

Vielen Dank. Genau das war das Problem. Dein Tipp war genau das was ich gesucht habe. Nun passt alles.

[erledigt]

10.01.2011 - 12:42 Uhr

Ich bin gerade dabei einen Artikelkatalog aus einer Datenbank heraus zu generieren. Das ganze wird über Crystal Reports als PDF Datei ausgegeben. Soweit so gut.
Mein Problem ist, dass Crystal Reports bei der Darstellung Probleme hat.

Im Anhang habe ich einen Screenshot meines Reports und dem Ergebnis (Formatierungsproblems) angehängt.

Ich übergebe ein Dataset an den Report. Bei den "Rahmen" im Report handelt es sich ausschließlich um Linienobjekte. Die Tabellenfelder Bezeichnung & Beschreibung sind auf "CanGrow = True" gesetzt.

Der Report erzeugt automatisch eine PDF Datei. Wie man schön erkennen kann habe ich ein Formatierungsproblem. Die Rahmen sind praktisch um 1 Artikel verschoben. Sprich Crystal Reports setzt mir die Trennlinien an die falsche Stelle.

Woran könnte das liegen? Ich verstehe einfach nicht wieso Crystal Reports erst 1 Artikel später die "Rahmengröße" des vorherigen Artikels setzt. Ich bin für jede Anregung offen. Danke für die Hilfe.

25.10.2010 - 08:17 Uhr

Danke für die Antwort. Das hilft mir so aber erst einmal nicht weiter. Vielleicht noch mal das Problem erklärt.

Ich habe einen Report in dessen Berichtsfuß sich ein Textfeld befindet. An das Textfeld übergebe ich einen mehrzeiligen Text. Da es sich um eine Auflistung handelt, muss ich an bestimmten Stellen (der Lesbarkeit wegen) einen Zeilenumbruch machen.

Das ganze sieht in etwa so aus:

Report r = new Report();
TextObject textfeld;
textfeld = r.ReportDefinition.ReportObjects["textfeld"] as TextObject;
textfeld.Text = mehrzeiligerString;

Das ganze muss zwingend im Berichtsfuß stehen.
Das Replace scheint wohl nur auf Spalten in einer Tabelle anwendbar und nicht auf Textfelder. Deswegen wohl auch die Fehlermeldung "Dieser Feldname ist unbekannt".

Wie vorher schon geschrieben ignoriert Crystal Reports alle, im String übergebenen, Zeilenumbrüche.

Ich bin nun auf der Suche nach einer Lösung. Ob das nun der oben beschriebene Weg ist, oder was völlig anderes spielt keine Rolle. Ich Bau auch eine 2te Tabelle in mein Dataset ein wenn es sein muss. Hauptsache ich bekomme die Daten entsprechend formatiert in den Berichtsfuß.

Vielen Dank noch mal für die Hilfe.

22.10.2010 - 09:32 Uhr

Ich wollte in einem Report im Berichtsfuß eine Zusammenfassung anzeigen lassen.
Dazu habe ich ein Textfeld in den Bericht eingefügt und die Eigenschaft "CanGrow" auf true gesetzt.

Egal ob nun "\n" oder "Environment.NewLine". Der Report ignoriert den Zeilenumbruch und schreibt den Text einfach fortlaufend in das Textfeld.

Wie bekomme ich Crystal Report dazu an entsprechender Stelle im String einen Zeilenumbruch durchzuführen?

Im Netz habe ich den Hinweis auf Formelfelder gefunden. Aber die Beschreibungen dazu sind sehr dürftig. Und die eigene Hilfe gibt auch nichts dazu her.

Replace ({SatzDetails},";" ,chr(13) )

Wenn ich ein Formelfeld (SatzDetails) erstelle und diesen Code einfüge bekomme ich die Fehlermeldung: "Dieser Feldname ist unbekannt". Was will Crystal Report von mir? Das ursprüngliche Textfeld als "Quelle" wird mit dem gleichen Fehler quittiert.
Im Net finde ich nur den Code, aber keinerlei weitere Info die das genauer erklärt. Die Hilfe gibt nur "nichts gefunden" zurück.
Ich verstehe nicht was Crystal Report von mir will. Welches Feld soll ich denn bitteschön als Datenquelle für die Funktion angeben? Es scheint ja, dass dies die einzige Möglichkeit ist, Zeilenumbrüche in Crystal Report einzufügen.