Laden...

Forenbeiträge von Mortimer Ingesamt 19 Beiträge

10.06.2009 - 19:18 Uhr

So, ich will mich erstmal mit Bilddateien der einzelnen Monate begnügen und dann weiter sehen. Hier gibt es aber eine kleine Merkwürdigkeit:

            panKalenderMain.ScrollControlIntoView(dgvDezember);

            MessageBox.Show("click"); // Führt zu korrektem Screenshot des Controls, nach Bestätigung durch User.
            // Thread.Sleep(2000); // Führt zu vorzeitigem Screenshot des Controls, weil noch nicht gescrollt wurde.

            Image imgDez = pf.GetBitmap(dgvDezember);
            imgDez.Save("Dezember.png", ImageFormat.Png);

Bevor ich die Message bestätige, scrollt er mir brav nach unten und macht einen korrekten Screenshot des Controls. Mit dem Sleep Befehl scrollt er aber nicht sofort nach unten, sondern wartet bis der SleepTimer abgelaufen ist, scrollt dann und der Screenshot kommt zu früh, d.h. das Bild zeigt dann wieder irgendwas von den sichtbaren Monaten.

Wie macht man das korrekt, also ohne UserBestätigung und MessageBox?

10.06.2009 - 14:53 Uhr

Alle Lösungen, die ich gefunden habe, beziehen sich nur auf sichtbare Controls oder auf das Parent Control, das man dann als vollständigen Screenshot bekommt. Beides nicht das Richtige.

Es kann doch nicht sein, dass ich alle dgvs jetzt per GDI auf das PrintForm malen muss oder?

10.06.2009 - 14:31 Uhr

...hat denn niemand eine Idee? Zumindest einen Workaround?

09.06.2009 - 02:19 Uhr

Hallo,

mit

                Graphics gControl = adgvMonate[i].CreateGraphics();
                Image img = new Bitmap(adgvMonate[i].Width, adgvMonate[i].Height, gControl);
                IntPtr dc1 = gControl.GetHdc();
                IntPtr dc2 = g.GetHdc();
                BitBlt(dc2, 24, iy + 20, adgvMonate[i].ClientRectangle.Width, adgvMonate[i].ClientRectangle.Height, dc1, 0, 0, SRCCOPY);

generiere ich mir eine Druckseite aus einzelnen DataGridViews die in einer Form sichtbar sind. In der Form muss man aber scrollen, um alle dgvs sehen zu können, das ist auch so gewollt. Auf der von mir generierten PrintPage sind jetzt aber nur die DataGridViews zu sehen, die auch in der Form zu sehen sind, also nicht jene, für die man nach unten scrollen muss.

Ich gehe mal davon aus, dass BitBlt dann einfach nicht das richtige für diesen Fall ist. Wie komme ich dann an die dgvs ran, die erst nach scrollen in der Form sichtbar sind und wie bekomme diese dann äusserlich wie mit BitBlt auf eine Druckseite? All meine Versuche mit Graphics.DrawImage usw. führten bisher leider nur zu leeren Rahmen auf der Seite.

15.05.2009 - 14:19 Uhr

woweeeee!! 😄 Funktioniert, danke! 😃

15.05.2009 - 12:25 Uhr

Nein, leider fkt. das auch nicht. ist ja auch nix anderes als dgvMyDGV.Select(); oder? Woran kann das denn noch liegen..?

15.05.2009 - 12:14 Uhr

also


private void tabPage3_Enter(object sender, EventArgs e)
{
            dgvMyDGV.Select();
            MessageBox.Show(this.ActiveControl.Name); // liefert dgvMyDGV.
            dgvMyDGV.Focus();
            MessageBox.Show(this.Focused.ToString());  // liefert True.
}

...bringts nicht. Ich muss erst mit der Maus in das dgv klicken, damit ich editieren kann und scrollen kann ich es auch dann erst.
Hab ich da noch ein Verständnisproblem mit ActiveControl? Eine Activate-Methode gibt es nicht für das dgv.

15.05.2009 - 11:58 Uhr

Es gibt hier schon einiges zum Thema Focus(), hab aber auf Folgendes keine Antwort gefunden:
Ich habe ein form mit einem tabControl und ein paar tabPages, die jeweils ein DataGridView enthalten. Bei Wechsel zu einer andern tabPage soll sofort das dgv den Focus enthalten, damit sofort Eingaben möglich sind. Mit


private void tabPage3_Enter(object sender, EventArgs e)
{
      dgvMyDGV.Focus();
}

geht das aber nicht. Auch


private void tabPage3_Enter(object sender, EventArgs e)
{
      tabPage3.Select();
      dgvMyDGV.Focus();
}

hilft mir nicht weiter. Was hab ich hier vergessen oder nicht beachtet?
Spielt es übrigens für Focus() eine Rolle, ob das dgv readonly ist oder nicht?
Danke schon mal.

06.05.2009 - 23:37 Uhr

Okay, danke. Kannst mich da auf die richtige Spur bringen? Was wäre ein gute Ansatz, die Felder eines Kalender zu speichern, ein simples string[][]?

06.05.2009 - 23:15 Uhr

Hallo,
folgendes Problem: In einem Dictionary

private Dictionary<string, DataGridView[]> DgvEntries = new Dictionary<string, DataGridView[]>();

will ich unter der Jahreszahl, z.B. "2009" <key>, jeweils 12 Monate speichern, die wiederum in einem DataGridView Array <value> gespeichert sind. Sinn ist, dass der User im Kalender Termine eintragen kann und beim Blättern durch verschiedene Jahre die Einträge praktischerweise nicht verloren gehen sollen, sondern eben in diesem Dictionary gespeichert werden -- und zwar die kompletten DataGridViews. Wählt der User nun ein Jahr an in dem er schon einmal war, wird das

DataGridView[] MyMonths

unter dem <key> der Jahreszahl wieder vorgeholt und angezeigt.

Klappt prinzipiell alles super, leider verändern sich aber (und das ist genau das Problem) die Values im Dictionary zur Laufzeit, d.h. ich finde dann z.B. unter dem Jahr <key> 2009 nicht die Monate (DataGridView, <value>) zu 2009, sondern die das aktuell angezeigten Jahres -- ohne nochmal explizit in das Dictionary gespeichert zu haben. Sobald ich also anfange, an dem Monatsarray

DataGridView[] MyMonths

zu manipulieren, verändere ich die gespeicherten DataGridViews im Dictionary gleich mit.

Ich habe mit const, readonly und

dgv = DataGridView[])adgvMonate.Clone();

(dgv adde ich dann als <value> ins Dictionary) herumprobiert, hilft alles nix. Sitze seit 2 Tagen drüber, hab keinen Hinweis bisher gefunden. SOS!

03.05.2009 - 20:28 Uhr

Habt vielen Dank, ich werde beides mal ausprobieren! 😃

03.05.2009 - 00:08 Uhr

ähm... wie meinen? versteh ich nicht ganz, sorry.

02.05.2009 - 23:27 Uhr

Hallo,
ich würde gern

           
            this.dgvJanuar.SelectionChanged += new EventHandler(dgvJanuar_SelectionChanged);
            this.dgvFebruar.SelectionChanged += new EventHandler(dgvFebruar_SelectionChanged); 
// ...

durch

for (int i = 0; i < adgvMonate.Length; i++)
{
    string sEventMethodName = adgvMonate[i].Name+"_SelectionChanged";
    adgvMonate[i].SelectionChanged += new EventHandler(sEventMethodName);
}

ersetzen. Also den Methodennamen durch eine Variable. Fkt. leider nicht und gibt die Fehlermeldung "'sEventMethodName' is a 'variable' but is used like a 'method'". Geht das allgemein nicht oder mach ich was falsch? Danke schon mal.

21.04.2009 - 19:41 Uhr

Vielen Dank für Eure Antworten, ich habe es jetzt über die Cancel-Funktion mit der ESC-Taste gelöst und nun erscheint die Abfrage auch nur einmal.

Mich würde aber trotzdem noch interessieren, woran es lag, dass die Abfrage 2x kam - hat nicht jemand noch eine Vermutung?

21.04.2009 - 01:35 Uhr

Hallo,
meine Form soll man über ESC-Taste und Kreuz rechts oben verlassen können:


this.KeyDown += new KeyEventHandler(Form1_KeyDown);
this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);

private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
                if (e.KeyCode == Keys.Escape)
                {
                    this.Close();
                }
        }

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
                int dlgresult = 7;
                if (pbrcalc.bChangeSinceLastSave == true)
                {
                    dlgresult = (int)MessageBox.Show("Veränderte Daten wurden noch nicht gespeichert. Trotzdem verlassen?", "Achtung", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                }
                else { dlgresult = 6; }
                switch (dlgresult)
                {
                    case 7: e.Cancel = true; break;
                    case 6: break;
                }
        }

Bei Schliessen über Kreuz kommt die Abfrage wie gewünscht nur 1x, bei der ESC-Taste jedoch 2x. Ich habe nach der Lösung gesucht, aber es immer nur wieder so gefunden, wie ich es auch programmiert habe. Muss ich irgendwo anders noch was einstellen oder hab ich was vergessen? Danke schonmal.

09.03.2009 - 11:59 Uhr

Hallo,
ich hab ein Problem mit dem Tabbing, also dem Wählen bestimmter Controls über die TAB-Taste. TabStops und TebIndex ist bei allen Controls festgelegt und funktionieren. Ich habe jedoch im Form ein DataGridView, in das man zunächst Werte einträgt und die letzten Zellen bestehen aus Ergebniszellen, die nicht editierbar sind. Die editierbaren Zellen des DataGridView sind mit der TAB-Taste korrekt wählbar. Ich habe dafür die Klasse DataGridView folgendermaßen überschrieben:

    public class MyGrid : System.Windows.Forms.DataGridView
    {
	    protected override void OnKeyUp(System.Windows.Forms.KeyEventArgs e)
	    {
            Form1 form1 = new Form1();
		    base.OnKeyUp(e);
		    if (e.KeyCode == Keys.Tab) {
                while (base.CurrentCell.ReadOnly)
                {
                    base.ProcessTabKey(e.KeyData);
                }
                // hier ohne Wirkung:
                // ProcessTabKey(e.KeyData);
                // form1.butOK.Select();
                // form1.butOK.Focus();
                // ProcessTabKey(e.KeyData);                 
	    }
    }

Das Problem ist nun, dass man mit base.ProcessTabKey nicht aus dem DataGridView kommt. Die Aktivierung bleibt immer über der letzten Zelle stehen, auch wenn diese nicht editierbar ist. Nach der letzten editierbaren Zelle soll die Aktivierung automatisch auf einen OK-Button des Form1 springen. Muss ich diesen irgendwie aktivieren oder als Parent definieren? Habe schon viel probiert, will alles nicht funktionieren. Danke schonmal.

08.03.2009 - 17:29 Uhr

Funktioniert super bei mir, jedoch kann ich mit ProcessTabKey das DataGridView nicht verlassen und zu dem nächsten Control springen (bei mir ein OK-Button). Er bleibt dann trotzdem auf der letzten Zelle stehen. Tabindexe etc. sind okay, daran liegt es nicht. Muss ich den Button noch zusätzlich focussieren oder so?

09.02.2009 - 17:10 Uhr

this.splitContainer2.

06.02.2009 - 20:16 Uhr

...auf die Idee kam ich auch, ist aber leider keine gute Lösung. Der User kann dann z.B. mt den Cursortasten in diese "blinden" Felder rutschen und die Selektierung muss dann mit der Maus wiedergeholt werden -- sehr unschön.

Hat jemand inzwischen eine andere Idee, wie man bestimmte Cells oder ganze Columns / Rows unselektierbar machen kann?