Laden...

Forenbeiträge von Adleano Ingesamt 31 Beiträge

27.02.2014 - 16:03 Uhr

besten Dank für den Link.
Die Implementierung hat soweit schon mal sehr gut funktioniert und ich denke, dass ich das soweit auch kapiert hab 🙂

Im Prinzip läuft das ja dann so, dass ich ein Custom-Control habe, dass ich dann an die jeweilige Spalte hänge. Dieses Control implementiert dann alles was ich benötige:

  • Button-Cell
    -Textbox-Cell
  • Combobox-Cell
  • usw.

An was ich jetzt noch hänge ist, wie ich diese ganzen Controls miteinander "verheirate", sodass ich nachher ein Template mit allen jeweils benötigten "Sub-Controls" erhalte. Ich brauch ja je Zelle immer nur eines der Controls...

Hat hier noch jemand einen Tipp?

Besten Dank.

27.02.2014 - 10:54 Uhr

Hallo zusammen,

für ein Projekt bin ich gerade dabei, ein Datagridview zu erstelellen, in dem der Anwender Rückmeldungen zu verschiedenen Aufgaben geben muss. Dabei steht jede Aufgabe in einer Zeile.

Jetzt möchte ich in der Spalte rechts daneben verschiedene Controls einfügen:

  • Wenn Aufgabe erledigt werden muss, soll eine Checkbox eingefügt werden.
  • Wenn etwas anderes ausgeführt werden soll, soll ein Button eingefügt werden.
  • Vielleicht brauch ich noch Radio-Buttons, aber denke eher nicht.

Die Buttons in Form einer DataGridViewButtonCell einzufügen hab ich hinbekommen.
Wenn ich in der selben Spalte aber auch eine DataGridViewCheckBoxCell einfügen möchte, bekomme ich nach Aufbau des Grids folgenden Fehler:

Fehlermeldung:
DataGridView-Ausnahme:
System.FormatException: Der formatierte Wert der Zelle hat einen falschen Typ.

Schuld daran ist das Zellformat der Spalte.

Hier mein Code, den ich für´s testen verwende:


            DataTable DataTableChecks = new DataTable();
            DataGridView DataGridViewOutput = new DataGridView();
            DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();

            //Formatiert alle Spalten als TextboxCell
            //DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();
            DataGridViewOutput = PrepareOuputDGV(DataGridViewOutput);
            DataTableChecks = DSCheckPrograms.Tables[test.Tag.ToString()];
            //Alle Zeilen durchlaufen
            foreach (DataRow row in DataTableChecks.Rows)
            {
                //Checkbox
                if (string.Compare(row["Istwert_Erfassung_DyBe"].ToString(), "ja", true) == 0)   
                {
                    CheckBox chkbox = new CheckBox();
                    chkbox.Visible = true;
                    DataGridViewOutput.Rows.Add(row["Puefung_Name_de"], row["Pruefung_Text_de"], false);
                    DataGridViewCheckBoxCell checkboxcell = new DataGridViewCheckBoxCell();
                    DataGridViewOutput.Columns[2].DefaultCellStyle.Format = "YesNo"; //Formatierung umstellen
                    DataGridViewOutput.Rows[DataGridViewOutput.Rows.Count - 2].Cells[2].Value = false;
                    DataGridViewOutput.Rows[DataGridViewOutput.Rows.Count - 2].Cells[2] = checkboxcell; //Erzeugt Fehler!!
                }
                //Numerisch --> Button Plus und Button Minus
                else if (IsNumeric(row["Istwert_Erfassung_DyBe"].ToString()) == true)             
                {
                    DataGridViewButtonCell buttonCell = new DataGridViewButtonCell();
                    DataGridViewButtonCell buttonCell1 = new DataGridViewButtonCell();
                    buttonCell.Value = "+";
                    buttonCell1.Value = "-";
                    DataGridViewOutput.Rows.Add(row["Puefung_Name_de"], row["Pruefung_Text_de"]); 
                    DataGridViewOutput.Rows[DataGridViewOutput.Rows.Count - 2].Cells[2] = buttonCell;
                    DataGridViewOutput.Rows[DataGridViewOutput.Rows.Count - 2].Cells[3] = buttonCell1;
                }
                else
                {
                    DataGridViewOutput.Columns[2].CellTemplate = cell;
                    DataGridViewOutput.Rows.Add(row["Puefung_Name_de"], row["Pruefung_Text_de"]); //Für Textfeld-Rückmeldung
                }
               
            }
                }

Kann man in einer Spalte verschiedene Controls (oder auch keine) implementieren?
Wenn ja, was mach ich falsch?

Vielen Dank schonmal.

Grüße Adleano

22.01.2014 - 13:47 Uhr

ich hab das Problem momentan in einem Dataset mit mehreren Tabellen.
Daher müsste dass dann ja mit einem Left Join gehen, oder?
Falls jemand grad die Syntax dazu im Kopf hat gerne. Werde aber selber gleich mal danach recherchieren.

Ich beschäftige mich erst seit kurzem mit den Datasets und ADO.NET...

Grüße

21.01.2014 - 16:27 Uhr

Hallo zusammen,

vielen Dank für die Antworten.

Ich habe dazu folgende Funktion gebastelt:


public static IEnumerable<DataRow> TestExcept(DataSet TestDS)
        {
            
            IEnumerable<DataRow> DataRowsTable0 = TestDS.Tables[0].AsEnumerable();
            IEnumerable<DataRow> DataRowsTable1 = TestDS.Tables[1].AsEnumerable();
            IEnumerable<DataRow> result = DataRowsTable0.Except(DataRowsTable1);
            return result;
        }

In den jeweiligen Zeilen der Tabellen des übergebenen Datasets stehen jeweils nur Textwerte.

Aber leider bekomme ich immer auch die Einträge zurück, die herausgefiltert werden sollen.
Habe ich da noch einen Denkfehler drin?

Beispiele für die Einträge in den beiden Tabellen, die in jeweils einer Zeile stehen können:
A 987 ABC 1457
Z ABR 123 XXX

21.01.2014 - 11:31 Uhr

Hallo zusammen,

ich habe ein Dataset mit mehreren Tabellen.

  • In der ersten Tabelle sind alle Einträge vorhanden, ohne eine Einschränkung.
  • In der zweiten Tabelle sind alle bereits verwendeten (Teilmenge aus 1. Tabelle) Einträge vorhanden.

Kann man jetzt in einer dritten Datatable alle Einträge filtern, die nicht in Verwendung sind? Also alle Einträge aus Tabelle 1, die nicht in Tabelle 2 enthalten sind? Oder alternativ auch die erste Tabelle so filtern, dass die verwendeten "ausgeblendet" sind?

Ziel ist die Anzeige aller nicht verwendeten Einträge in einem Datagridview.

Besten Dank.

11.06.2013 - 11:32 Uhr

tja dann hab ich hier wohl zwei solche Fälle gefunden...

Also dann werd ich mal nach ner anderen Lösung suchen.

Danke Euch allen für die Unterstützung.

11.06.2013 - 11:17 Uhr

ahhh jetzt versteh ichs. Vielen Dank dafür.

Jetzt gibt die Funktion nur leider immer false zurück. Egal ob der Rechner eingedockt ist oder nicht. 🙁
Habs bei zwei verschiedenen Notebooks probiert (unterschiedlich).

11.06.2013 - 09:28 Uhr

Hi, danke für´s Augen öffnen 😁
Ich blinder Mensch.

Was ich aber im Moment nicht so ganz verstehe ist, dass mir folgende Methode immer true zurückmeldet. Wenn ich das richtig verstehe, müsste die Funktion " CM_Is_Dock_Station_Present" ja den übergebenen Parameter "test" ja entsprechend true oder false setzen, jenachdem ob der Rechner eingedockt ist oder nicht. Oder liege ich da falsch?

Bei mir bleibt Test aber immer false und Blub immer true.


 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            bool test= false;
            bool blub = CM_Is_Dock_Station_Present(test);
            System.Windows.Forms.MessageBox.Show("Dockingstatus: " + blub);
        }

Besten Dank.

10.06.2013 - 08:31 Uhr

Hallo Abt,

vielen Dank für Deine Antwort.

bei unseren Rechnern hier wird das auch ein weiterer Standard-USB-Hub.

Ich würde es gerne mal mit der Implementierung von "CM_Is_Dock_Station_Present function" versuchen.
Ich häng aber leider grad nur an der Implementierung in einem kleinen C#-Testprogramm.
Muss ja soweit ich weiß über WinAPI funktionieren, oder?

Nur welche DLL und welche Parameter?
Könnt ihr mir dabei bitte helfen?

Besten Dank.

07.06.2013 - 09:06 Uhr

Hallo zusammen,

gibt es eigentlich einen Eventhandler für das Eindocken eines Notebooks in die Dockingstation?

Hintergrund ist folgender:
Wir haben bei uns einige Rechner (alles die gleichen), für die es auch Dockingstations gibt. JEder Rechner kann sich an einer beliebigen Dockingstation eindocken. Das hat dann allerdings zur Folge, dass jedes Mal wenn der Rechner an einer "neuen" Dockingstation eingedockt wird, durch den Rechner automatisch eine neue LAN-Verbindung erstellt wird.
Diese LAN-Verbindung muss ich dann mit einer statischen Konfiguration versehen, damit der Netzwerkzugriff funktioniert.

Alternativ wäre auch ein Eventhandler gut, der erkennt wenn eine neue LAN-Verbindung erstellt wird.

Hat jemand von Euch eine Idee dazu?

Besten Dank und viele Grüße
Adleano

18.04.2013 - 14:36 Uhr

ich habs gefunden. Folgende Zeilen waren daran schuld:

//.NET Version auslesen
RegistryKey installed_versions = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP");
string[] version_names = installed_versions.GetSubKeyNames();
//version names start with 'v', eg, 'v3.5' which needs to be trimmed off before conversion
double netversion = Convert.ToDouble(version_names[version_names.Length - 1].Remove(0, 1), CultureInfo.InvariantCulture);
_NETVersion = version_names[version_names.Length - 1].Remove(0, 1);
int SP = Convert.ToInt32(installed_versions.OpenSubKey(version_names[version_names.Length - 1]).GetValue("SP", 0));
18.04.2013 - 12:59 Uhr

sorry, hab mich unklar ausgedrückt.
Neue 2.0 Projekte kann ich erstellen.
Ich meinte dass die Gesamtanwendung aus mehreren Projekten besteht. Und die Exe ist in einem von diesen sozusagen "Unterprojekten" des gesamten Programms.

18.04.2013 - 12:28 Uhr

nicht dass ich wüsste. Hab das Projekt die ganze Zeit während der Entwicklungsphase auf 2.0 gelassen. DB-Funktionalitäten hab ich keine drin.

Problem ist dass ich halt garnix erkennen kann woran es liegt.

Wenn er beim Aufruf der Exe schon scheitert, kann man das dann auf dieses Projekt eingrenzen oder kann der Fehler überall stecken?

18.04.2013 - 11:31 Uhr

Hallo zusammen,

ich habe in VS2010 Pro ein Softwareprojekt erstellt, dass ich für eine Umgebung auf .NET 2.0 konfiguriert habe. In den ganzen Projekteigenschaften ist .NET 2.0 auch angegeben.

NAch dem Kompilieren läuft das Programm aber nur auf .NET 4.0 Rechnern. Bei .NET 2.0 Clients kommt nur eine Fehlermeldung > Fehlermeldung:

Fehlerbericht senden/nicht senden

Hat noch jemand eine Idee, woran es liegen könnte?

Wäre super dankbar für eine schnelle Antwort.

Grüße
Adleano

22.08.2012 - 16:05 Uhr

Hallo zusammen,

ich bin gerade dabei einen Updater zu bauen, der alle lokalen Dateien eines Clients ersetzt, deren letztes Änderungsdatum älter ist als das der Serverdatei.

Leider sind darunter auch einige geschützte Systemdateien.
Welche Möglichkeit habe ich, auch diese zu ersetzen?
Momentan bekomme ich folgenden Fehler:> Fehlermeldung:

Access to the path C:...\testfile.cbf is denied.

Das hier ist der Copy-Befehl, den ich verwende:

 
FileInfo fi = new FileInfo(file); //Zieldatei, die ersetzt werden soll
FileAttributes attribute;
attribute = (FileAttributes)(fi.Attributes -FileAttributes.ReadOnly -FileAttributes.System -FileAttributes.Hidden +FileAttributes.Normal);
File.SetAttributes(fi.FullName, attribute); 
File.Copy(sourcefile, fi.FullName, true); 

Ich habe auch schon versucht, per Batch-Befehl attrib -s /S zu verwenden. Dabei spielt es leider auch keine Rolle ob ich alle Parameter der Funktionen verwende oder nicht..

Hat jemand eine Idee, wie man das Problem lösen kann?
Vielen Dank.

21.08.2012 - 07:13 Uhr

Hallo zusammen,

wie kann man aus einer C#-Anwendung Tastenkombinationen an Windows (in meinem Fall noch Win-XP) schicken?

Hintergrund ist folgender:
Ich habe auf einigen Win-XP-Rechnern eine Litestep-Umgebung installiert. Diese "hängt" quasi direkt als Shell über Win-XP und fängt alle Hotkeys, die abgeschickt werden, ab.

Nur leider bekomm ich das nicht hin, an Windows eine Tastenkombination (z. B. Alt+STRG+R zu schicken. Litestep habe ich bereits beigebracht, auf diesen Hotkey zu reagieren. Jetzt fehlt noch der Sende-Aufruf per Code.

Vielen Dank schonmal für Eure Hilfe.

25.04.2012 - 10:52 Uhr

Hallo Herbivore,

vielen Dank für die schnelle Antwort.
Ich Esel hab gerade gemerkt, dass es an dem Leerzeichen bei der Übergabe des Arguments lag. Habe / d übergeben statt /d ...
Thread erledigt 🙂

25.04.2012 - 08:09 Uhr

Hallo zusammen,

ich möchte ein Programm parameterisiert starten, aber irgendwie kommt der übergebene Parameter nicht an.

Aufruf über cmd-Fenster (manuell) läuft:

  1. Programm starten: lcd.exe
  2. Parameter an Programm schicken: lcd.exe /d
    --> Parameter kommt an und Programm reagiert korrekt darauf. Also alles bestens.

Wenn ich das ganze per C# mache, bekomme ich nur die Meldung "LCD.exe is already running.

Hier der Code den ich verwende

Code:


System.Diagnostics.ProcessStartInfo pinfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c" + @"c:\lcdtool\lcd.exe");
                                pinfo.UseShellExecute = false;
                                pinfo.CreateNoWindow = true;
                                p.StartInfo = pinfo;
                                p.Start();
                                System.Threading.Thread.Sleep(1000);
                                System.Diagnostics.ProcessStartInfo pinfo1 = new System.Diagnostics.ProcessStartInfo("cmd", "/c" + @"c:\lcdtool\lcd.exe / d");
                                pinfo1.UseShellExecute = false;
                                pinfo1.CreateNoWindow = true;
                                p.StartInfo = pinfo1;
                                p.Start();

Wie sieht denn das Pendant von den o. g. CMD-Befehlen in C# aus?

Vielen Dank.

13.02.2012 - 10:58 Uhr

Hallo herbivore,

danke für die Antwort.
Wenn ich dich richtig verstanden habe, müsste ich also auch das Rechteck für den Cursor manuell zeichen? Wenn ja, wie bekomme ich dann die richtige Cursor-Position und Größe heraus, um das Rechteck entsprechend zu zeichnen?
Oder gibt es dazu ein Beispiel?

09.02.2012 - 15:48 Uhr

Hey,

Ich habe einen Datetimepicker, bei dem ich die Hintergrundfarbe angepasst habe.
Dazu habe ich die "OnPaint-Methode" der Klasse DateTimePicker mit einer eigenen überschrieben. Somit kann ich die Combobox mit einem Rectangle mit der entsprechenden Farbe füllen. --> Funktioniert.

Problem ist, dass ich jetzt nicht mehr den Cursor sehe (ursprünglich wird der markierte Wert mit blauer Hintergrundfarbe dargestellt). Jetzt allerdings sieht man diese Einfärbung nicht mehr, wenn man in der Combobox einen Tag, Monat, Jahr usw. markiert. Funktionalität ist da, aber man kann es leider nicht mehr erkennen. Im Web hab ich dazu leider nichts gefunden.

Kennt jemand das PRoblem und weiß wie man das lösen kann?

Danke vielmals und Grüße

20.01.2012 - 15:14 Uhr

Hallo zusammen,

könnt ihr mir bitte bei einem - hoffentlich kleinen - Problem weiterhelfen?
Ich bastel gerade ein kleines Backuptool mit einer Windows-Form. Die Daten werden im Moment in einem eigenen Thread kopiert, nachdem der Anwender auf den Start-Button geklickt hat. Durch den eigenen Thread schmeißt das Programm keine Fehlermeldung, wenn sehr viele Dateien kopiert werden müssen.

Allerdings bekomme ich keine Fortschrittsanzeige über den Verlauf hin. Es muss nicht unbedingt ein Fortschrittsbalken sein (wäre zwar schön aber nicht zwingend nötig).
Was ich versucht habe ist die gerade kopierte Datei in einem Textfeld auf der Maske oder in einer eigenen Statusmaske auszugeben.

Wie muss man hier vorgehen, um so etwas zu erreichen?

Hier der Code, den ich im Moment hierzu erstellt habe:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Management;
using System.IO;
using Microsoft.VisualBasic.FileIO;
using System.Threading;


namespace Backup_tool
{
    public partial class frm_Backup : Form
    {
        public static string dirCopySource = System.String.Empty;
        public static string dirCopyTarget = System.String.Empty;
        public static string _Pfad_Protokoll = System.String.Empty;
        public static float groesse_Quellverz = 0.0f;
        public static float groesse_Zielverz = 0.0f;
        public static bool _Abbruch;
        Thread backup;

        public frm_Backup()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.btnStart.Enabled = false;
            _Abbruch = false;

        }

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

        private void btnStart_Click(object sender, EventArgs e)
        {
            //Backup back = new Backup();
            backup = new Thread(delegate()
            {
                back.erstelle_backup(dirCopySource, dirCopyTarget);
	    });
            backup.Start(); 
	}

        
        private void btnAbbruch_Click(object sender, EventArgs e)
        {
            backup.Abort();
            this.txtStatus.Text = "Verarbeitung abgebrochen.";
        }
  }


    public class Backup
    {

        public void erstelle_backup(string dirCopySource, string dirCopyTarget)
        {
            if (form_status == null) 
            {
                form_status = new frm_Status();
                form_status.Show();
            }


            string[] subDirectories = Directory.GetDirectories(dirCopySource);                                  // alle Unterverzeichnisse des aktuellen Verzeichnisses ermitteln
            StringBuilder newTargetPath = new StringBuilder();                                                  // Zielpfad erzeugen
            {
                newTargetPath.Append(dirCopyTarget);
                newTargetPath.Append(dirCopySource.Substring(dirCopySource.LastIndexOf(@"\")));
            }
            if (!Directory.Exists(newTargetPath.ToString()))                                                    // wenn aktueller Ordner nicht existiert -> ersstellen
                Directory.CreateDirectory(newTargetPath.ToString());

            foreach (string subDirectory in subDirectories)                                                     // Unterverzeichnise durchlaufen und Funktion mit dazu gehörigen Zielpfad erneut aufrufen (Rekursion)
            {
                string newDirectoryPath = subDirectory;
                if (newDirectoryPath.LastIndexOf(@"\") == (newDirectoryPath.Length - 1))                        // wenn ''/'' an letzter Stelle dann entfernen
                { newDirectoryPath = newDirectoryPath.Substring(0, newDirectoryPath.Length - 1); }
                
                erstelle_backup(newDirectoryPath, newTargetPath.ToString());                     // rekursiever Aufruf für Unterordner
            }

            // alle enthaltenden Dateien des aktuellen Verzeichnisses ermitteln und kopieren
            string[] fileNames = Directory.GetFiles(dirCopySource);
            foreach (string fileSource in fileNames)
            {
                StringBuilder fileTarget = new StringBuilder();                                                 // Zielpfad + Dateiname
                {
                    fileTarget.Append(newTargetPath);
                    fileTarget.Append(fileSource.Substring(fileSource.LastIndexOf(@"\")));
                }
                File.Copy(fileSource, fileTarget.ToString(), true);                                             // Datei kopieren, wenn schon vorhanden überschreiben
            }
        }
    }
}

Vielen Dank schonmal.

20.01.2012 - 11:07 Uhr

Hallo zusammen,

ich werde jetzt hoffentlich nicht gleich gesteinigt. Aber wie schick ich an Windows die Tasten-Kombination ALT+STRG+R?

Hab zwar im Web gesucht aber nichts genaues dazu gefunden (oder hab ich falsch gesucht?)

Hintergrund ist, dass ich eine Litestep-Oberfläche hab, in der ich den o. g. Shortcut definiert hab, wodurch dann ein sog. !Bang-Command ausgeführt wird.
Das Litestep habe ich schon so konfiguriert, dass es auf die Tastenkombination reagiert, d. h. ich muss nur noch dafür sorgen, dass die Tastenkombination an Windows gesendet wird.

Vielen Dank.

18.11.2011 - 09:56 Uhr

Hallo zusammen,

ich habe mir eine kleine Konsolenanwendung erstellt, die mehrere andere Programme nacheinander aufruft.

Zunächst wird ein Updater aufgerufen, der als Parameter ein Laufwerksbuchstabe übergeben bekommt. Sobald der Updater fertig ist soll die nächste Anwendung gestartet werden.

Problem: Wenn ich das wie folgt mache funktioniert führt er das Update nicht korrekt aus. Wenn ich den Programm-Block "Updater starten" in einer eigenen Konsolenanwendung starte funktioniert es. Kann mir jemand sagen warum?

Hier der Auszug aus meinem Quellcode:


//Updater starten
Console.WriteLine("Start Update");
Directory.SetCurrentDirectory(pfadUpdater);                       //Lokales Arbeitsverzeichnis wechseln
ProcessStartInfo updater = new ProcessStartInfo();                //Neuen Prozess erzeugen
updater.FileName = @"C:\Updater\updateclient.exe";                //Dateiname festelegen
updater.WindowStyle = ProcessWindowStyle.Normal;
updater.Arguments = "U:";                                         //Parameter übergeben
Process updaterproc = Process.Start(updater);                     //Updater starten
updaterproc.WaitForExit();                                        //Auf Beendigung des Prozesses warten
Console.WriteLine("Update Ende");                                 //Meldung das Update beendet
//Ende Updater

//Nächstes Programm starten
Process[] tool2 = Process.GetProcessesByName("Tool2");            
if (tool2.Length < 1)                                             
{
    System.Diagnostics.Process proc_tool2 = new System.Diagnostics.Process(); 
    proc_tool2.StartInfo.FileName = @"C:\Programm2\tool2.exe";    
    proc_tool2.Start();                                           
    Console.WriteLine("Tool 2 gestartet");  

Vielen Dank schonmal für Eure Hilfe.

Grüße
Adleano

19.10.2011 - 11:17 Uhr

Hallo zusammen,

nach Googlesuche konnte ich leider zu meinem Problem nichts wirklich funktionierendes finden. Hoffe ich war nicht blind..

Ich möchte über eine kleine Konsolenanwendung die Zeitzone eines Clients setzen können.
Wie setzt man denn die Zeitzone (denke mal Registry-Eintrag) denn via C# .NET 2.0?

Der Registry-Key müsste ja der hier sein, oder?
"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones";

Vielen Dank schonmal und Grüße

11.10.2011 - 16:32 Uhr

Hallo zusammen,

vielen Dank für die Tipps. Konnte das ganze jetzt so lösen, nachdem ich verstanden habe wie das mit dem CellPaint-Eventhandler funktioniert 🙂


private void dataGridView1_CellPainting(object sender, System.Windows.Forms.DataGridViewCellPaintingEventArgs e)
        {
            e.Paint(e.CellBounds, DataGridViewPaintParts.All); //& DataGridViewPaintParts.Border);  //DataGridViewPaintParts.All &
            Pen p = new Pen(Color.Black, 2);
            Rectangle rect = e.CellBounds;

            if (e.RowIndex % 9 == 0 & e.ColumnIndex >= 0)                               
            { e.Graphics.DrawLine(p, rect.Left, rect.Top, rect.Right, rect.Top+1);
              
            e.Handled = true;
            }      //Waagerechte Linie

            if (e.RowIndex >= 0 & e.ColumnIndex == 0)
            { e.Graphics.DrawLine(p, rect.Left, rect.Top, rect.Left, rect.Bottom);
            e.Handled = true;
            }    //Senkrechte Linie Links

            if (e.RowIndex >= 0 & e.ColumnIndex == dataGridView1.ColumnCount - 1)
            { e.Graphics.DrawLine(p, rect.Right, rect.Top, rect.Right, rect.Bottom);
            e.Handled = true;
            }  //Senkrechte Linie Rechts
       }

Thema damit erledigt. Vielen Dank. 👍

30.09.2011 - 13:46 Uhr

Hallo zusammen,

trotz Googlesuche und einigen Snippits komm ich beim Setzen eines Rahmens von einzelnen Zeilen nicht weiter.

Meine Tabelle sieht ungefähr so aus:

Spalte 1: Spalte 2:
Label 1 Text zu Label 1 (Usereingabe)
Label 2 Text zu Label 2 (Usereingabe)
Label 3 Text zu Label 3 (Usereingabe)
Label 1
Label 2
Label 3

Die Labels 1 - 3 werden automatisch eingefügt, wenn der Anwender eine neue Zeile hinzufügt. bzw. beim erstmaligen Öffnen sofort.

Ziel ist jetzt zwischen Label 3 und Label 1 eine Trennlinie zu zeichnen, sodass der Anwender besser erkennt, dass ein neuer Block beginnt.
Ich habs schon über das RowPrePaint-Event probiert, allerdings bekomme ich im Moment nur ein Rechteck hin, sodass die ganze Zeile eingerahmt ist:


        private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            if (e.RowIndex == 0 || e.RowIndex == dataGridView1.Rows.Count - 1)
            {
               
               dataGridView1.BorderStyle = DataGridViewCellBorderStyle.Sbds.Top = DataGridViewAdvancedBorderStyle.Sing
               e.PaintCells(e.RowBounds, DataGridViewPaintParts.All & ~DataGridViewPaintParts.Border);
               using (Pen p = new Pen(Color.Black, 1))
                {
                    Rectangle rect = e.RowBounds;
                    rect.Width -= 3;
                    rect.Height -= 3;
                    e.Graphics.DrawRectangle(p, rect);
                }
                e.Handled = true;
            }
        }

Ich hätte aber gerne nur eine Linie, sprich Rows(Index der Zeile in der Label1 steht).Borders.Top

Wie macht man sowas?

Vielen Dank.

30.09.2011 - 11:13 Uhr

Halo herbivore,

danke für den Link. Hab das ganze nun gelöst bekommen. 😃

Vielen Dank und Grüße

27.09.2011 - 11:08 Uhr

Hallo bredator,

vielen Dank für die schnelle Antwort. Die beiden Event-Prozeduren wollen nicht richtig, weil sie sich immer selbst aufrufen wenn eine neue Zeile hinzufgefügt wird --> Endlosschleife 🙁

Mit dem Dataset bin ich noch am kämpfen was das Anlegen der Folgezeilen angeht.
Form-Load trägt alle gewünschten Zeilen ein. Soweit kein Problem.
Aber wie muss ich das machen, um bei einer neuen Zeile, die der Anwender hinzufügt wieder nicht nur die eine Zeile hinzuzufügen sondern alle 9 mit den gewünschten Labels?

27.09.2011 - 08:37 Uhr

Hallo zusammen,

ich habe erst angefangen mich mit C# zu beschäftigen und habe ein Problem beim Hinzufügen von Zeilen einer Tabelle.

Folgende Situation:
Auf einer WinForm habe ich ein Datagridview mit 2 Spalten (erste = Labels, zweite = Text vom Anwender). In der ersten Spalte sollen immer feste Texte eingefügt werden die dem Anwender einen Hinweis über das geben was in der zweiten Spalte eingetragen werden muss. Das sind insgesamt 9 Zeilen.

Beim Laden der Form füge ich dem DataGridView die entspr. Zeilen hinzu. Passt wunderbar. Wenn der Anwender bei geöffneter Form eine neue Zeile hinzufügt, sollen wieder die neuen Zeilen mit den Labels automatisch hinzugefügt werden.
Dazu hatte ich mir gedacht, dass ich das "CellEnter" Event oder "RowEnter" Event nutze. Allerdings funktioniert das leider nicht.

Wenn ich die Zeilen mit Hilfe eines ENumerators hinzufügen will kommt folgende Fehlermeldung: > Fehlermeldung:

Fehler! Pparation is not valid due to the current state of the object

Wenn ich die Zeilen über Rows.Add hinzufügen möchte kommt die Fehlermeldung: > Fehlermeldung:

Fehler! Operation cannot be performed in this event handler.

Könnt ihr mir bitte helfen?

Ziel ist wie gesagt: Wenn der Anwender in der Tabelle eine neue Zeile hinzufügt sollen automatisch 9 Zeilen mit den entsprechenden Labels in Spalte 1 hinzugefügt werden.

Vielen Dank schonmal und Grüße

07.02.2011 - 10:25 Uhr

Hallo,

sorry für die etwas späte Antwort. Die Suche nach Refactoring bringt allerdings bessere Ergebnisse 😃

@herbivore
Da geb ich Dir absolut recht. Vielen Dank für das Stichwort.

Generell ist es mir wichtig mich in den Code einzuarbeiten und zu verstehen, was geändert werden muss. Daher möchte ich eher weniger auf fertige Tools zurückgreifen um genau die Gefahren zu umgehen. Wäre ziemlich schlecht, wenn sich dadurch ein Fehler einschleicht der dann erst rauskommt, wenn der Code produktiv läuft.

Mal sehen was sich zu den Themen von WinSharp93 so finden lässt 😃

Vielen Dank schonmal an alle. Das hilft doch mal ein gutes Stück weiter.

26.01.2011 - 12:52 Uhr

Hallo zusammen,

ich bin neu hier also erst mal ein nettes Hallo an alle hier.

Ich soll mich im Laufe dieses Jahres in C# tiefer einarbeiten und eine Quellcodebereinigung von einem bestehenden Programm (mit Entwicklungsumgebung Visual Studio 2008) durchführen.

Daher bin ich jetzt auf der Suche nach einer Schulung, weil ich mit C# noch nicht wirklich großartig was angestellt hab (komme von VBA her) und eine Quellcodebereinigung in dem Maß habe ich bisher noch nicht gemacht. könnt ihr mir da etwas empfehlen oder eine Richtung geben? Hat jemand für so etwas schon Erfahrungen gesammelt? Vielen Dank schonmal.