Laden...

Probleme beim Zeichnen

Erstellt von myBig? vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.965 Views
M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 16 Jahren
Probleme beim Zeichnen

Hi Zusammen,

habe da ein Problem festgestellt, dass ich bis jetzt noch nicht lösen konnte. Vielleicht weiß jemand rat und kann mir helfen.

Ich habe ein DataGridView in den Columns steht das Datum. Vom 01.01.2007 bis 31.03.2007. Hier ist der Code dazu:


int tage, tage1;
            ka.Kalender1();
            tage = ka.tage1;
            monat1 = ka.monatslaenge;

            tage1 = 0;

            for (int i = 1; i < 4; i++)
            {
                tage1 += Convert.ToInt32(monat1[i - 1]);
            }

            DateTime dt = new DateTime(2006, 12, 31);
            
            for (int i = 1; i < tage1 + 1; i++)
            {
                dataGridView1.Columns.Add(dt.AddDays(i).ToShortDateString(), (dt.AddDays(i).DayOfWeek.ToString() + " " + dt.AddDays(i).ToShortDateString()));
                
                dataGridView2.Columns.Add(dt.AddDays(i).ToShortDateString(), dt.AddDays(i).DayOfWeek.ToString() + " " + dt.AddDays(i).ToShortDateString());
            }

Das klappt ja auch wunderbar. Jetzt möchte ich, dass ein Zeitstrahl gezeichnet wird z.B. vom 02.01.2007 bis 15.01.2007. Das klappt auch wunderbar, allerdings nur bis zum 17.01.2007. Also wenn ich z.B. einen Zeitstrahl vom 02.01.2007 bis 18.01.2007, dann werden die X und Y Koordinate mit 0 ausgegeben, also in der oberen Ecke. Für den Startpunkt kommen die richtigen Koordinate.

Hier ist mein Code zum Zeichnen:


Pen pen = new Pen(Brushes.Black, 8);
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (row.Index == dataGridView1.RowCount - 1)
                {
                    break;
                }
                Point anfang = new Point();
                Point ende = new Point();
                anfang.X = -1;
                ende.X = -1;
                foreach (DataGridViewColumn col in dataGridView1.Columns)
                {
                    Rectangle rec = dataGridView1.GetCellDisplayRectangle(col.Index, row.Index, true);
                    dataGridView1.RectangleToClient(rec);
                    if (col.Name == "01.01.2007")
                    {

                        anfang.X = rec.Left + rec.Width / 2;
                        anfang.Y = rec.Top + rec.Height / 2;
                    }

                    if (col.Name == "18.01.2007")
                    {
                        ende.X = rec.Left + rec.Width / 2;
                        ende.Y = rec.Top + rec.Height / 2;
                    }
                }
                if (anfang.X >= 0 && ende.X >= 0)
                {
                    pen.StartCap = LineCap.DiamondAnchor;
                    pen.EndCap = LineCap.DiamondAnchor;
                    e.Graphics.DrawLine(pen, anfang, ende);
                }
            }

Wäre echt super wenn mir einer helfen könnte, kann es mir nicht erklären, warum er ab dem 18.01.2007 nur noch die 0 für die X und Y Koordinate ermittelt.

MfG

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo myBig?,

weil du immer die linke Seite der Zelle verwendest. Du muss aber bei der ende-Zelle die rechte Seite verwenden (oder evtl. gar die Linke Seite der nächsten Zelle).

Typischer "off-by-one" Fehler. Solltest du unbedingt selber finden lernen.

herbivore

M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 16 Jahren

Hi herbivore,

könnte es nicht eher daran liegen, dass ich


Rectangle rec = dataGridView1.GetCellDisplayRectangle(col.Index, row.Index, false);
                    dataGridView1.RectangleToClient(rec);

benutze? Denn es passiert nur wenn das Datum was ich eingebe ausserhalb vom Bildschirm ist. Also ich kann vom 01.01.2007 bis 15.01.2007 sehen und müsste dann scrollen um die anderen zu sehen.

MfG

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo myBig?,

das kann durchaus ein weiterer Grund sein.

herbivore

M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 16 Jahren

Guten Morgen herbivore,

das denke ich leider auch. Habe es mal getestet, sobald die Columns im Sichfeld sind, dann zeichnet er wieder so wie es sein soll. Hast du vielleicht ein Tip für mich, wie ich es anders machen kann? Oder muss ich vielleicht in der _CellPainting zeichnen? Die erste zeichne ich nämlich in _Paint.

MfG

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo myBig?,

wo willst du denn überhaupt hinzeichnen? In die Zellen? Dann interessieren dich ja auch nur die sichtbaren. Allerdings denke ich dann auch, dass du in sowieso in CellPainting zeichnen und da bekommst du sicher in den EventArgs auch mitgeteilt, wo genau du zeichnen musst.

herbivore

M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 16 Jahren

Hi herbivore,

jupps ich will nur in den Zellen zeichnen. Das stimmt, dass mich nur die Sichtbaren interessieren.

Blöde frage ich weiß, aber wie stelle ich es denn an wenn die Punkte also der Startpunkt und der Endpunkt oder nur einer davon nicht Sichtbar ist.

Es müsste doch machbar sein ein Zeitstrahl zwischen einem Anfangsdatum und einen Enddatum zu zeichnen.

Komme da einfach nicht weiter,wäre echt super wenn du mir da auf die Sprünge helfen könntest.

MfG

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo myBig?,

wie schon gesagt, musst du nur in die sichtbaren Zellen zeichnen. Der "Trick" ist einfach nur zu wissen, ob die Zelle zwischen Anfang und Ende liegt und das kannst du ja für jede Zelle leicht abfragen.

herbivore

M
myBig? Themenstarter:in
241 Beiträge seit 2005
vor 16 Jahren

Hallo herbivore,

ich glaube ich habe mich schon zu doll verrannt 🤔 ?(

das ist richtig ich will nur in den Sichtbaren Zellen zeichnen. Aber die Linie die ich zeichne sollte schon Wagerecht angezeigt werden auch wenn der Endpunkt ausserhalb des Sichtbereiches ist.

Ich habe also ein Anfangspunkt der ermittelt werden kann, da er ja aufm Bildschirm sichtbar ist, dann habe ich ein Endpunkt der nicht Sichtbar ist, daher bekomme ich auch .X = 0 und .Y = 0. Das ist ja auch logisch, da er mir die Koordinaten nicht ermitteln kann, da sie nicht aufm Bildschirm sind.

Wie stelle ich es denn an, dass er mir die Linie bis zum ende der Sichtbaren Zelle zeichnet und sobald ich Scrolle für jede weitere Zelle bis zum Endpunkt?

Ich glaub so langsam must du mich für völlig blöd halten, innerlich hoffe ich nicht 🙂

MfG

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo myBig?,

vergiss doch mal deine Koordinaten und zeichne zellenweise. In CellPainting. Und da musst du immer nur vom Anfang bis zum Ende der Zelle zeichnen. Und die Koordinaten bekommst du in den EventArgs. Also musst du nur noch ermitteln, ob du in der Zelle eine Linie vom Zellanfang bis zum Zellende zeichnen musst oder nicht und das bekommst du wie gesagt raus, in dem du fragst, ob die Zelle zwischen der Anfangs- und der Endzelle liegt.

herbivore