Laden...

Forenbeiträge von Bonvie Ingesamt 173 Beiträge

10.01.2008 - 21:18 Uhr

Hallo an alle,
kann mir jemand von Euch sagen, wie ich bei meiner System.Windows.Forms.MaskedTextBox überprüfen kann ob eine Zahl im Textfeld steht?
Meine Mask sieht für den Betrag folgendes vor ##.## und den PromptChar habe ich auf '_' gesetzt. Leider gibt nun this.BetragMaskedTextBox.Text.Length als auch this.BetragMaskedTextBox.TextLength 5 zurück anstatt 0 obwohl nichts im Feld steht.

Bonvie

14.11.2007 - 10:10 Uhr

Hallo an alle,
habe mich mal seit langen wieder an mein Projekt gesetzt und habe ToolTips eingeführt. Soweit so gut, da sich aber der Benutzer die Farben selbst setzen kann sollen auch die ToolTips angepasst werden.
Bisher habe ich dafür bei jedem Fenster eine Methode aufgerufen der ich die ControlCollection übergeben habe. Innerhalb der Methode habe ich dann den Type des einzelnen Controls abgefragt und die erforderlichen Parameter gesetzt.

So wollte ich auch für die TooTips vorgehen, allerdings sagt mir der Compiler, das Enumerator nie ein ToolTip sein kann. Ist das richtig, oder habe ich etwas falsch gemacht.
Demnach würde in einer ControlCollection kein ToolTip auftauchen, allerdings habe ich bisher nichts gefunden, was in einer ControlCollection drin ist und was nicht.

Danke und Gruß
Bonvie

28.08.2007 - 14:35 Uhr

Dann hast du doch den Type DateTime bereits im DataGridView und kannst dort mit dem Designer oder per Hand das Format definieren.
Das ist doch dann das was du willst, oder ?

Ansonsten einfach mal etwas Code zum drüber schauen!

Gruß
Bonvie

28.08.2007 - 14:24 Uhr

Schieb einfach das Datenfeld in ein DateTime Objekt und gib es danach mit .ToString im gewünschten Format aus !

Sollte gehen bzw. gemäß den Exception dann die noch anpassen 🙂

Gruß
Bonvie

19.08.2007 - 17:14 Uhr

Danke Juetho für deine Hilfe, mit deinem Hinweis, dass die beiden nichts gemeinsam haben, habe ich nun einen Parameter im WriteTable2CSV eingeführt, der angibt ob alle oder nur die selektierten Rows exportiert werden sollen. Damit durchlaufe ich zwar auch bei der selektieren Variante alle Rows, aber ich denke das ist genauso schnell als würde ich die Elemente vorher für den Export kopieren.
Also ein weiteres mal nicht schön aber selten 🙂

Gruß
Bonvie

19.08.2007 - 15:38 Uhr

Hallo an alle,
ich komme mal wieder nicht weiter. Ich habe eine Export Funktion für meine DataGridViews geschrieben. Die sieht wie folgt aus:

WriteTable2CSV(string FullFileName, DataGridViewRowCollection TabellenInhalt)

Bisher habe ich somit einfach

WriteTable2CSV(aktSaveFileDialog.FileName, this.DataGridView1.Rows)

aufgerufen.

Nun soll ich zusätzlich nur die selektierten Rows zum Export geben, aber leider funktioniert die Übergabe mit

WriteTable2CSV(aktSaveFileDialog.FileName, this.DataGridView1.SelectedRows)

nicht.

Fehler: 2-Argument kann nicht von "System.Windows.Forms.DataGridViewSelectedRowCollection" in "System.Windows.Forms.DataGridViewRowCollection" konvertiert werden.

Wie übergebe ich nur die selektierten Rows ?
Oder wie muss ich WriteTable2CSV anpassen?

Danke und Gruß
Bonvie

31.07.2007 - 22:12 Uhr

OK, danke für die Hilfe herbivore.
Mit folgendem Code komme ich erstmal weiter. Aber wie do schon sagtest ich muss das ganze noch etwas ausfeilen.

if (relativPathCheckBox.Checked)
{
    TempString = TempString.Replace(SaveDirectory.Text, "");
    myFile.WriteLine("." + TempString);
}
else
    myFile.WriteLine(TempString);

Gruß
Bonvie

31.07.2007 - 21:35 Uhr

Danke für deine Antwort,
aber dein Beispiel entspricht der Path.GetDirectoryName-Methode.

D.h. wenn der relativer_pfad "\NochEinOrdner\EineDatei.txt" lauten sollte, muss ich Length - 2 nehmen. Dann muss ich wohl den kleinsten gemeinsamen Nenner finden ?

Gibt es auch solche relativen Pfade "\..\..\Temp" ?
Dann wird die Sache wohl richtig aufwendig!

Gibt es keine MS Methode für sowas ?

Gruß
Bonvie

31.07.2007 - 21:02 Uhr

Hallo an alle,
ich stehe mal wieder auf dem Schlauch und benötige einen Anstoß oder ein neues Stichwort zum Suchen.
Ich habe eine Liste mit Dateinamen, die ich in eine Textdatei schreibe. Soweit so gut, nun wollen einige Benutzer diese Dateinamen aber als relativ zu dem Suchverzeichnis haben, da sich bei diesen Benutzern die Netzlaufwerke je nach Arbeitsort ändern.

Meine Frage wie wandele ich einen absoluten Pfad in einen relativen Pfad um?
Ich probiere derzeit eine Methode zu finden, die mir nach Übergabe eines absoluten Pfades mit Dateinamen und dem Suchverzeichnis als Basis den relativen Pfad mit Dateinamen zurückgibt. Gibt es so etwas ?

Danke und Gruß
Bonvie

15.06.2007 - 18:23 Uhr

Vielen Dank winSharp93, genau das wars.
Ich weis echt nicht wie lange ich den Fehler schon gesucht habe.

Also nochmals vielen Dank
Bonvie

15.06.2007 - 16:06 Uhr

Hatte noch keiner ein ähnliches Problem ?
Schönes Wochenende (Happy Coding)
Bonvie

11.06.2007 - 21:52 Uhr

Hallo Pedro,
du implemetierts im falschen Event und rufts die richtige Basis funktion auf.
Probiere es doch mal mit protected override void OnPaint(PaintEventArgs e)

Gruß
Bonvie

11.06.2007 - 21:37 Uhr

Hallo an alle,
ich brauche mal Euren Rat. Ich komme nicht dahinter.
Ich habe mir einen ColorButton gebaut, um meinen Benutzern Farbeinstellungen zu ermöglichen. Eigentlich sollte das nichts großes sein, aber bei mir funktioniert es leider nicht 100%ig.

Der folgende Code stellt zwar einen Button dar, wenn ich allerdings z.B. eine Markierung über diesem Button mache wird dieser nicht richtig aktualisiert (siehe Bild). Erst wenn ich die Markierung los lasse wird der Button richtig neu gezeichnet. Wie machen das andere Controls, denen eine solche Markierung "nichts aus macht".

public class ColorButton : System.Windows.Forms.Button
{
    public ColorButton()
    {
        this.Name = "ColorButton";
        this.Size = new System.Drawing.Size(50, 50);		// Default size of control
        this.SetStyle(ControlStyles.AllPaintingInWmPaint |
                      ControlStyles.UserPaint |
                      ControlStyles.DoubleBuffer, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        Rectangle myColorRectangle = e.ClipRectangle;
        myColorRectangle.Inflate(-this.frameWidth, -this.frameWidth);
        if (myColorRectangle.X > 1)
            myColorRectangle.X--;
        if (myColorRectangle.Y > 1)
            myColorRectangle.Y--;

        base.OnPaint(e);

        SolidBrush ColorBrush = new SolidBrush(this.innerColor);
        e.Graphics.FillRectangle(ColorBrush, myColorRectangle);

        Pen boarderPen = new Pen(Color.Black, 1);
        e.Graphics.DrawRectangle(boarderPen, myColorRectangle);

        ColorBrush = new SolidBrush(this.ForeColor);
        StringFormat myStringFormat = new StringFormat();
        myStringFormat.Alignment = ButtonDrawHelper.ConvertToHorAlign(this.TextAlign);
        myStringFormat.LineAlignment = ButtonDrawHelper.ConvertToVertAlign(this.TextAlign);
        e.Graphics.DrawString(this.Text, this.Font, ColorBrush, e.ClipRectangle, myStringFormat);

        myStringFormat.Dispose();
        ColorBrush.Dispose();
        boarderPen.Dispose();
    }
}

Danke und Gruß
Bonvie

23.05.2007 - 21:42 Uhr

Hallo dr4g0n76,
danke für dein Angebot. Beim Erstellen der Bilder ist es mir glaube ich gedämmert.
Im Farbverlauf ist die Farbe ja nicht mehr die gleiche wie die für die Transparenz.
Das heißt ich kann mit dieser Lösung wohl kein Fenster generieen das wie das angehängte Bild aussieht.

Also meine Frage, wie kann ich ein Fenster mit einem Schatten bzw einem Halb-Transparenten Hintergrund am Rand hinbekommen.

Danke und Gruß
Bonvie

P.S. der Strich wird in meiner App derzeit Transparent der Rahmen nicht!

23.05.2007 - 15:17 Uhr

Hallo mmh,
wie und wo zeichnest du denn die Bilder auf den Buttons. An der Transparenz liegt es glaube ich nicht, ich verwende auch pngs mit Transparenz.

Gruß
Bonvie

23.05.2007 - 15:11 Uhr

Hallo an alle,
irgendwie steige ich nicht mehr dahinter. Ich möchte eine Grafik als Form darstellen und die Ecken natürlich transparent haben. Die folgenden Threads habe ich dazu gefunden.
Form ohne Rahmen mit transparenten Ecken
Form mit runden ecken?
Runde Form

Die Rigion Variante fällt aus, da meine Grafik im Farbverlauf nach außen transparent wird. Ich habe also ein Form zusammengestellt die Grafik als Background und den Transparenzkey auf Schwarz oder Magenta gesetzt. Egal welche Farbe ich zum ausblenden benutze die Ecken der Grafik werden nicht rund. Ich habe es nun mit PNG, JPG und BMPs probiert, leider bis jetzt ohne Erfolg.

this.BackColor = System.Drawing.Color.Black;
this.BackgroundImage = global::nsForm1.Properties.Resources.SplashLogo;
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
this.ClientSize = new System.Drawing.Size(475, 230);
this.ControlBox = false;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "SplashWindow";
this.ShowIcon = false;
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "SplashWindow";
this.TopMost = true;
this.TransparencyKey = System.Drawing.Color.Black;

Kann jemand helfen ?

20.05.2007 - 20:42 Uhr

Hallo juetho und Hallo herbivore,
ich habe es aktuell so wir du juetho vorgeschlagen hast realisiert. Allerdings wird diese Sortierung dem Benutzer nicht vollständig angezeigt. D.h. es sieht nur nach einer Sortierung für Spalte1 aus. Zudem ist es für die anderen Spalten zu umständlich um z.B. intuitives Verhalten zu ermöglichen. Kurz die Lösung ist eher etwas bescheiden, aber besser als nichts.

private void myDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.ColumnIndex == Spalte1)
    {
        if (this.myBindingSource.Sort.Contains("ASC"))
            this.myBindingSource.Sort = "Spalte1 DESC, Spalte2 DESC";
        else
            this.myBindingSource.Sort = "Spalte1 ASC, Spalte2 ASC";
    }
}

Danke und Gruß
Bonvie

20.05.2007 - 15:08 Uhr

Hallo an alle,
ich brauche mal wieder Eure Hilfe.

Ich habe ein DataGridView an ein BindingSource gebunden und möchte über zwei Spalten sortieren. Wenn ich das im Programm setze ist dies recht einfach:

this.myBindingSource.Sort = "Spalte1 ASC, Spalte2 ASC";

Allerdings wie bekomme ich dies hin, wenn der Benutzer die Spalte1 im DataGridView anklickt?
Welches Event wird dann ausgelöst?
Kann ich in diesem Event das auch wie oben setzen ?

Danke und Gruß
Bonvie

15.05.2007 - 17:19 Uhr

Hallo frisch,
das geht bei dir aber noch sehr durcheinander. Ein Zertifikat ist lediglich ein signierter öffentlicher Schlüssel, d.h. mit den vielen Dokumenten gelesen glaube ich nicht. Ich empfehle dir
http://de.wikipedia.org/wiki/Asymmetrisches_Kryptosystem
und
http://de.wikipedia.org/wiki/Digitale_Signatur
http://www.heise.de/security/dienste/pgp/

Aber noch mal zu deiner Frage:
Für eine Signatur benötigst du: Den Text, einen Hash davon und diesen verschlüsselst du mit einem privaten Schlüssel.
Für die Signaturprüfung benötigst du: Den Text mit Signatur und den öffentlichen Schlüssel des signierenden.

Ob der öffentliche Schlüssel nun in einem Zertifikat untergebracht ist oder nicht ist für die technische Prüfung egal. Du musst selber entscheiden, was es dir bringt zu wissen das der Text zwar unverändert erscheint du aber nicht weißt von wem.
Für den Rechnungsversand solltest du dir dann auch überlegen, wie der Empfänger deine Signatur prüfen kann, z.B. ich führe kein Programm aus, das mir mit einer Rechnung zugestellt wird.

Gruß
Bonvie

15.05.2007 - 11:29 Uhr

Hallo herbivore,
danke für den Hinweise, werde mir das Ganze noch mal durch den Kopf gehen lassen. Der Hinweis im MSDN rät ja davon ab:
MSDN Control.LostFocus-Ereignis
.....
Legen Sie den Fokus nicht vom LostFocus-Ereignishandler aus fest. Andernfalls reagiert die Anwendung oder das Betriebssystem möglicherweise nicht mehr. Weitere Informationen zum LostFocus-Ereignis finden Sie in der MSDN Library im Abschnitt "Keyboard Input Reference" unter dem Thema WM_KILLFOCUS und in der Platform SDK-Dokumentation der MSDN Library im Abschnitt "Messages and Messages Queues" unter dem Thema Message Deadlocks unter http://msdn.microsoft.com/library/deu.
......

Danke und Gruß
Bonvie

13.05.2007 - 01:52 Uhr

Hallo an alle,
ich bin mal wider auf der Suche nach dem richtigen Weg. Ich habe einige Buttons in meiner Applikation, die sich auf das gleiche DataGridView beziehen. Das heiß mit diesen Buttons kann ich Daten bearbeiten, vormerken, markieren, löschen usw.
Ich möchte nun, dass trotz des Clicks auf diese Buttons der Focus beim DataGridView bleibt, damit der Benutzer das Scrollrad weiter benutzen kann

Aus meiner Sicht Suche ich ein LostFocus für Buttons oder eine Event von meinem Form das ca. ActiveControlChanged heißen könnte beides konnte ich aber leider bisher nicht finden. Bin ich so auf dem Holzweg ?

Dort würde ich dann den Focus so wieder setzen:

this.ActiveControl = this.myDataGridView;

Danke und Gruß
Bonvie

11.05.2007 - 13:00 Uhr

Hallo Joerg,
ich habe auch noch mal gesucht und hatte dann den folgenden Tipp gefunden:
Desktop/Fenstereinstellungen
und gleich wie folgt probiert:

Registry regKey = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop\WindowMetrics");
if (regKey != null)
{
    string regTempValue = (string)regKey.GetValue("BorderWidth");
    int regValue = System.Convert.ToInt32(regTempValue);
    if(regValue < 20)
        regKey.SetValue("BorderWidth", 20);
}

Leider OHNE Erfolg ich erhalte immer die Fehlermeldung: "Cannot write to the registry key."
Verfolgst du das Thema noch weiter? Mich interessieren zwar mehr die Farben aber die Kontrolle über die Breite finde ich auch interessant.

Gruß
Bonvie

08.05.2007 - 14:07 Uhr

Also an modal führt meines Wissens innerhalb deiner Anwendung kein Weg vorbei. Damit musst du es schon mal nicht modal anzeigen lassen und zwischen deinen zwei Fenstern kommunizieren.

Gruß
Bonvie

08.05.2007 - 14:04 Uhr

Hallo an alle,
ich bin auf der Suche, wie ich im DataGridview die ScrollBar anpassen kann. Nach der ersten Suche habe ich nun verstanden, dass ich mir erstmal meine eigene Klasse ableiten muss. Dies habe ich wie folgt getan, aber leider ohne Erfolg:

public class myDataGridView : System.Windows.Forms.DataGridView
{
    public myDataGridView()
    {
        this.VerticalScrollBar.Visible = true;
        this.VerticalScrollBar.Width = 30;

        this.HorizontalScrollBar.Visible = true;
        this.HorizontalScrollBar.Height = 30;
    }
}

Was mache ich noch falsch?

Wenn das funktioniert will ich mich an die Farben wagen und das hässliche Grau verbannen, aber das ist noch Zukunftsmusik. Hat jemand eine Beispiel wir das geht. Auf CodeProject habe ich lediglich Beispiele von ganzen Scrollbars gefunden, die kann ich ja dem DataGridView nicht übergeben, oder?

Danke und Gruß
Bonvie

04.05.2007 - 13:04 Uhr

Gefunden, sorry für die blöde Frage:

BindingSource.Find()

04.05.2007 - 11:47 Uhr

Hallo an alle,
suche aktuell nach einer Möglichkeit von einem Datensatz von dem ich den Primärschlüssel aus dem DataSet kenne die Position im DataGridView herauszufinden. Umgekehrt kann ich ja über das Findby() gehen aber wie geht es in diese Richtung, oder ist das nicht möglich ?

Danke und Gruß
Bonvie

04.05.2007 - 11:44 Uhr

Hallo Katja,
danke für deine Hilfe. Ich habe den Fehler gefunden, der Grund war zwar nicht wie von dir vermutet der Primärschlüssel sondern der Fremdschlüssel. Ich muss also anstatt die ForeignId zu tauschen nur die ForeignRow tauschen und schon gehts.

Gruß
Bonvie

30.04.2007 - 14:18 Uhr

Hallo an alle,
ich habe noch ein weiteres Datenbankproblem (Access *.mdb über ADOX 2.8 ).

Ich habe eine Tabelle der abzuarbeitenden Tasks, die wie folgt aussieht.

Tabelle: MYList
int ForeignId  (Referenziert den Eintrag in der Tabelle mit allen Tasks)
int WorkId  (Ist ein Prio.Wert, den der Benutzer sich setzten kann)
int AutoId  (Ist die ID, mit der auch die Reihenfolge festgelegt wird)

Die Reihenfolge soll nun vom Benutzer editiert werden können, also möchte ich die Werte ForeignId und WorkId jeweils tauschen und habe das wie folgt implementiert

private void switchMYListItem(int first, int second)
{
    int tempIntMYListItem;
    MYDataSet.MYListRow MYListRow01 = this.MYDataSet.MYList.FindById((int)this.MYListDataGridView.Rows[first].Cells[LIST_Id].Value);
    MYDataSet.MYListRow MYListRow02 = this.MYDataSet.MYList.FindById((int)this.MYListDataGridView.Rows[second].Cells[LIST_Id].Value);
    
    tempIntMYListItem = MYListRow01.ForeignId;
    MYListRow01.ForeignId = MYListRow02.ForeignId;
    MYListRow02.ForeignId = tempIntMYListItem;
    
    tempIntMYListItem = MYListRow01.WorkId;
    MYListRow01.WorkId = MYListRow02.WorkId;
    MYListRow02.WorkId = tempIntMYListItem;
}

Als die Tabelle noch mehr Werte hatte, hat diese Implementierung funktioniert, ehrlich! Nun nach der Reduzierung auf die wirklich notwendigen Werte geht das leider nicht mehr.
Fehlermeldung: Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.

Also vermute ich, dass die Zeile nicht eindeutig gefunden wird.

  • Wie kann ich mein Update anpassen, damit immer nur anhand der AutoId selektiert wird.
  • Was bedeuten die "?" in dem Update Command (Habe ich aus dem DataSet designer von VS2005 kopiert)
UPDATE `MYList` SET `ForeignId` = ?, `WorkId` = ? WHERE (((? = 1 AND `ForeignId` IS NULL) OR (`ForeignId` = ?)) AND ((? = 1 AND `WorkId` IS NULL) OR (`WorkId` = ?)) AND (`AutoId` = ?))

Danke und Gruß
Bonvie

29.04.2007 - 13:58 Uhr

Hallo Lobo,
ich hatte ein ähnliches Problem gehabt und habe dies über SQL gelöst. Ich habe mir eine View mit dem folgenden Befehl zusammen gebaut. Hier mal für dich angepasst:
CREATE VIEW allTitels AS SELECT Autors.Autorname , Titels.Titel FROM Autors INNER JOIN Titels ON Autors.Id = Titles.Id

Diese kannst du dann im DataGridView anzeigen. Funktioniert ausgezeichnet allerdings kann ich aktuell noch keine Datensätze löschen.

Hoffe das Hilft
Gruß
Bonvie

28.04.2007 - 01:12 Uhr

Hallo an alle,
ich komme nicht mehr weiter. Ich habe gerade mein Datenbank Modell (Access *.mdb) umgestellt und kann nun keine Datensätze mehr löschen.
Vorher hatte ich eine Tabelle (myClip2), die ich in einem DataGridView abgebildet hatte. Dort konnte ich die Datensätze wie folgt löschen:

private void deleteButton_Click(object sender, EventArgs e)
{
	this.myClip2BindingSource.EndEdit();
	
	foreach (DataGridViewRow mySelectedRow in this.myClip2DataGridView.SelectedRows)
	    this.myDatabaseDataSet.MYClip2.RemoveMYClip2Row(this.myDatabaseDataSet.MYClip2.FindById((int)mySelectedRow.Cells[9].Value));
}

Heute habe ich nun zwischen die Tabelle (myClip2) und dem DataGridView eine view (myClip2View) gelegt, da ich noch andere Daten brauche. Alle Felder also auch die neuen aus der View werden angezeigt und können editiert werden. Nur löschen geht leider nicht. Hier mal die bisherigen Versuche:

private void deleteButton_Click(object sender, EventArgs e)
{
	this.myClip2BindingSource.EndEdit();
	this.myClip2ViewBindingSource.EndEdit();
	
	foreach (DataGridViewRow mySelectedRow in this.myClip2ViewDataGridView.SelectedRows)
	{
	    this.myDatabaseDataSet.MYClip2View.Rows[(int)mySelectedRow.Cells[LIST_Id].Value].Delete();
	    this.myDatabaseDataSet.MYClip2.RemoveMYClip2Row(this.myDatabaseDataSet.MYClip2.FindById((int)mySelectedRow.Cells[LIST_Id].Value));
	}
	
	this.myClip1TableAdapter.Update(this.myDatabaseDataSet.MYClip2);
	this.myDatabaseDataSet.MYClip2.AcceptChanges(); //accept the changes
	this.myClip2ViewTableAdapter.Fill(this.myDatabaseDataSet.MYClip2View);
}

Kann mir hierbei jemand helfen ?
Danke und Gruß
Bonvie

22.04.2007 - 11:53 Uhr

Hallo an alle,
ich versuche mich gerade an der DatagridviewImagecolumn und konnte auch schon das Bild setzten aber es flackert so komisch und die CPU Last steigt total. So wie es aussieht wird das Bild permanent gesetzt, warum?

private void myDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex == 5)
    {
        if((int)this.myDataGridView.Rows[e.RowIndex].Cells[6].Value > 0) 
            this.myDataGridView.Rows[e.RowIndex].Cells[5].Value = global::myForm.Properties.Resources.Ampel_rot;
        else
            this.myDataGridView.Rows[e.RowIndex].Cells[5].Value = global::myForm.Properties.Resources.Ampel_gruen;
    }
}

Kann mir einer von Euch sagen was ich falsch mache, mit Texten hat das bisher super funktioniert ?

Danke und Gruß
Bonvie

14.04.2007 - 23:01 Uhr

Gefunden:
Hatte mein UserControl als internal deklariert. Damit scheint der VS Editor nicht klar zu kommen bzw. kann nicht darauf zugreifen.

Also NUR
public partial class myControl : UserControl

und NICHT
internal partial class myControl : UserControl

So ein misst kostet echt Zeit !
Gruß
Bonvie

14.04.2007 - 21:03 Uhr

Hallo an alle,
ich verzweifle gerade. Ich habe ein Projekt mit einem Windows Form und eigenen User Controls, das ich auf einem anderen PC erstellt habe. Nun musste ich den PC wechseln und das Projekt umziehen. Hat auch erst ganz gut geklappt, ich konnte das Pojekt sauber kompilieren und auch starten.
Aber, sobald ich Form1.cs mit dem VS Editor aufrufe um an der Anordnung der Controls zu arbeiten, löscht dieser die Initialisierung meines User Controls, d.h. das nächste kompilieren geht noch, aber beim start knallst, da ein null Wert verwendet werden soll.

Wie überzeuge ich den VS Editor diese Zeilen nicht zu löschen!

Danke und Gruß
Bonvie

11.04.2007 - 15:30 Uhr

Hallo an alle,
ich brauche mal wieder einen Tipp.
Ich möchte gerne einen Rahmen mit runden Ecken um mein UserControl mit mehreren Buttons ziehen und ein kleines Bild oben rechts platzieren. Je nach Status soll der Rahmen rot (fehler) oder grün (erledigt) dargstellt werden.

Aus meiner Sicht habe ich zwei Möglichkeiten:
1.) GroupBox: Das Control muss ich umschreiben, um den Rahmen rund, dicker und in Farbe zu bekommen und danach das Image platzieren.
2.) Direkt ins UserControl zeichnen. Direktzeichnen hört sich zwar einfach an, aber das müsste ja dann nach den Beiträgen, die ich bis jetzt gelesen habe im OnPaint() passieren, nur in welchem und wie ermittle ich die Größe?

Meine Frage: Was ist einfacher oder wie sollte ich es machen und wo könnte ich noch weiter lesen ?

Danke und Gruß
Bonvie

03.04.2007 - 13:53 Uhr

Hallo an alle,
ich bin auf der Suche nach Gründen für ein Einfrieren meiner Anwendung, das ab und zu im längeren Verlauf meines Programms auftritt. Da ich bereits mit Backgroundworker arbeite kann ich die normale [FAQ] Warum blockiert mein GUI? ausschließen.

Den ersten Tipp den ich bekommen habe war: Für jedes new() auch ein dispose(). Ist das so? oder für welche Klassen sollte ein dispose() durchgeführt werden?

Gibt es noch weitere Tipps. Ich habe mit der Codeanalyse mal versucht das Problem zu lösen, ist aber bis jetzt leider auch nicht von Erfolg gekrönt.

Danke und Gruß
Bonvie

28.03.2007 - 21:28 Uhr

Hallo an alle,
ich hab’s geschafft und möchte Euch kurz meine Vorgehensweise beschreiben. Sie mag zwar umständlich sein, aber damit kommt ihr zum Ziel.

Wenn ihr so wie ich eine DLL und eine EXE habt, empfehle ich Euch zwei unterschiedliche Projekte, da die Einschränkungen es nicht erlauben die Eingabeassemblys unterschiedlich zu behandeln.

Also erst die Exe in ein neues Projekt aufnehmen und erstmal alle Ausnahmen unter Eingabe und Umbenennen anhaken und Schritt für Schritt dazu nehmen (Hacken weg). Der Dotfuscator ist so nett und speichert immer vor dem Erstellen der neuen EXE das Projekt. Bei mir konnte ich unter Eingabe alle Haken entfernen und beim Umbenennen waren die Properties, diejenigen die weiterhin angehackt bleiben mussten. Mehr gab es nicht zu verändern. Fertig

Bei der DLL bin ich ähnlich vorgegangen, allerdings war ja klar das der Hacken bei Bibliothek stehen bleiben muss, was sich auch gleich bei den Prozenten bemerkbar machte. Beim Umbenennen mussten wieder die Properties stehen bleiben und ganz wichtig unter Optionen muss der Namespace beibehalten werden, sonst findet die EXE die DLL nicht mehr. Ebenfalls fertig.

Die beiden XMLs liegen jetzt in meinem Projekt und holen sich beim Ausführen die release Dateien und speichern diese in einem Verzeichnis namens Dotfuscated. Dort befindet sich somit meine Anwendung die für die Öffentlichkeit vorbereitet ist.

Auch wenn es kein großer Schutz ist!
Viel Spaß
Bonvie

P.S. Sollte ich etwas vergessen haben oder jemand weiß wie es besser geht sagt bescheid.

16.03.2007 - 13:40 Uhr

Hallo dr4g0n76,
sorry habe deine Antwort erst jetzt (viel zu spät) gesehen.
Also ich habe zwei Dateien in meinem Projekt die ich gerne durch den Dotfuscator schicken möchte.
1.) meine UserControls.DLL in der ich einige Buttons angepasst habe, d.h. das Interface nach oben darf nicht verändert werden bzw. wie muss ich hier die Ausnahmen definieren.
2.) Meine Anwendung, die neben dem UserControl auch noch eine externe C++ DLL verwendet, d.h. hier muss das Interface nach unten gleich bleiben, damit ich weiterhin die Funktionen in der DLL finde.

Kann ich ganze Klassen in die Ausnahme stellen oder sollte ich separate Namespaces generieren, um die Ausnahme im Code zu pflegen. Fragen über fragen, danke für deine Hilfe!

Gruß
Bonvie

13.03.2007 - 17:21 Uhr

@ punkdevil,
danke für den Tip, muss ich für jedes new wenn möglich ein Dispose benutzen, oder wann darf ich mich auf den GC verlassen?

@ nils, aktuell schließe ich das aus, da ich einiges über Backgroundworker mache!

Also ein Tip, was eine nicht reagierende Anwendung an Infos raus gibt, wäre somit weiterhin klasse!

13.03.2007 - 10:26 Uhr

Hallo an alle,
ich brauche mal wieder einen Tipp. Ich habe eine Anwendung die eigentlich gut läuft, nun berichten Anwender, dass nach einiger Zeit die Anwendung einfriert und nicht mehr reagiert. Das einzige was helfen soll, ist die Anwendung zu beenden (geht anscheinen noch). Nachstellen scheint bisher nicht möglich da es an unterschiedlichen Punkten auftritt.
Wie kann ich mehr Informationen über diesen Hänger erhalten, gibt es z.B. Daten die das Framework irgendwo hinlegt?

Kurz wie kann ich dem Fehler auf die Sprünge kommen?
Ich weiß das sind wenig Infos, aber mehr habe ich im Moment noch nicht!
Danke und Gruß
Bonvie

12.03.2007 - 23:44 Uhr

Hallo an alle,
kennt jemand einen Weg den ToolTip eines ToolStrips farblich anzupassen. Bisher habe ich sowohl im ToolStrip als auch im ToolStripItem lediglich die Möglichkeit den Text zu ändern.
Ich möchte aber ForeColor und BackColor ändern.

Die zweite Möglichkeit wäre ein eignen ToolTip zu setzen, dies scheint allerdings nicht mit der Methode SetToolTip() zu gehen, da ich nicht zu einem Control komme.

Danke und Gruß
Bonvie

12.03.2007 - 21:01 Uhr

Hallo Daniel,
danke für deine Hilfe, und ja du hast Recht, da hätte ich auch selbst drauf kommen können. Ich hatte mich in der Zwischenzeit gegen die Diagonale entschieden und einfach die Mitte vertikal und horizontal durchlaufen. Geht wahrscheinlich noch schneller und ist "genauso ungenau". Hier meine Lösung:

public Color setForeColor(Bitmap tempBitmap)
{
    int x, y;
    double Helligkeit1 = 0;
    double Helligkeit2 = 0;

    x = tempBitmap.Width / 2;
    for (y = 0; y < tempBitmap.Height; y++)
    {
        Color tempColor = tempBitmap.GetPixel(x, y);
        Helligkeit1 += 0.2126 * tempColor.R + 0.7152 * tempColor.G + 0.0722 * tempColor.B;
    }
    Helligkeit1 = Helligkeit1 / y;

    y = tempBitmap.Height / 2;
    for (x = 0; x < tempBitmap.Width; x++)
    {
        Color tempColor = tempBitmap.GetPixel(x, y);
        Helligkeit2 += 0.2126 * tempColor.R + 0.7152 * tempColor.G + 0.0722 * tempColor.B;
    }
    Helligkeit2 = Helligkeit2 / x;

    Helligkeit1 = (Helligkeit1 + Helligkeit2) / 2;
    if (Helligkeit1 > 127.5)
        return (Color.Black);
    else
        return (Color.White);
}

Gruß
Bonvie

12.03.2007 - 15:14 Uhr

Tolle Antwort, muss ich schon sagen. 🤔 ?(
Der Pythagoras ist mir zwar ein Begriff und anwenden könnte ich ihn auch, wie ich allerdings auf die einzelnen Koordinaten komme, ohne dabei Pixel doppelt auszulesen ist mir noch unklar. In Rahmen meines Geometrie Unterrichtes hatten wir leider keine Pixel-Koordinaten.

12.03.2007 - 13:14 Uhr

Hallo an alle,
nachdem ich das mit der Luminanz für feste Farben hinbekommen habe möchte ich nun die Luminanz von JPG Dateien bestimmen.
Ich stelle mir das so vor. Damit ich nicht das ganze Bild berechnen muss will ich die Pixel auf der Diagonalen im Durchschnitt berechnen, also mit myBitmap.GetPixel(x, y). Aber wie berechne oder erhalte ich die Pixel von einer Diagonalen, wenn die Bilder immer unterschiedlich groß sein können?

Danke und Gruß
Bonvie

11.03.2007 - 22:28 Uhr

Hallo an alle,
hier mal meine Implementierung insbesonder mit der "neuen" Gewichtung!

public Color getForeColor(Color BackColor)
{
    //Helligkeit der Vordergrundfarbe bestimmen:
    // Gewichtung beim analogen PAL-Farbfernsehsystemen: Y = 0,299(R) + 0,587(G) + 0,114(B).
    // Gewichtung bei digitalen PAL- und NTSC-Systemen, JPEG- bzw. MPEG-basierten digitalen Bild- und Videosystemen: Y' = 0.2126 R' + 0.7152 G' + 0.0722 B'.
    double Helligkeit = 0.2126 * BackColor.R + 0.7152 * BackColor.G + 0.0722 * BackColor.B;

    //Hintergrundfarbe anpassen:
    if (Helligkeit > 127.5)
        return (Color.Black);
    else
        return (Color.White);
}

Gruß
Bonvie

08.03.2007 - 12:00 Uhr

Habe gerade etwas gefunden: http://vb-tec.de/rgb.htm

Hoher Kontrast durch Helligkeits-Unterschiede
Problem: Es soll eine Hintergrund-Farbe passend zu einer gegebenen Vordergrund-Farbe gesetzt werden (oder umgekehrt), so dass die Schrift gut lesbar ist. Die Komplementärfarbe ist dafür nicht unbedingt gut geeignet, da z.B. die Komplementärfarbe von Grau nämlich gerade Grau ist, d.h. der Kontrast wäre null! Besser ist da eine fixe Farbwahl in Abhängigkeit von der Helligkeit, z.B.:

'Helligkeit der Vordergrundfarbe bestimmen:
Helligkeit = (Rot + Grün + Blau) \ 3

'Hintergrundfarbe anpassen:
If Helligkeit > 127 Then
  HintergrundFarbe = vbBlack
Else
  HintergrundFarbe = vbWhite
End If

Gewichtete Helligkeit (Luminanz)
Oben wurde die Helligkeit einer Farbe als Mittelwert der drei Grundfarben bestimmt. Dies ist zwar mathematisch korrekt, aber tatsächlich sieht das menschliche Auge nicht über das ganze Licht-Spektrum gleichmäßig gut. (Zum Beispiel ist Grün viel wichtiger für die Helligkeits-Beurteilung als Blau.)

Möchte man daher diese "menschliche Unzulänglichkeit" berücksichtigen, müssen die Farbanteile entsprechend (prozentual zur typischen Wahrnehmung) gewichtet werden:

Helligkeit = 0.3 * Rot + 0.59 * Grün + 0.11 * Blau
08.03.2007 - 11:51 Uhr

Hallo Felix,
erstmal danke für deine Hilfe und du hast ja auch Recht. Die Methode toArgb() hatte ich auch schon gefunden, allerdings sagt die doch nichts über die Helligkeit aus, oder?

Ich stelle mir eine Funktion oder Algorithmus vor, der mir sagt die Helligkeit beträgt x%. Damit würde ich dann bis 50% Schwarz als Vordergrund nehmen und für den Rest weiß.

Gruß
Bonvie

08.03.2007 - 11:17 Uhr

Hallo an alle,
kann man mit Farben rechnen, d.h. kann ich irgendwie bestimmen ob die Schrift im Vordergrund weiß oder schwarz sein sollte?

Genauer: Ich habe als Background einen Farbverlauf den der Benutzer selbst bestimmen kann und möchte anhand der Helligkeit entscheiden, wann der Text schwarz oder weiß sein sollte. Geht, das ?

Gruß
Bonvie

21.02.2007 - 12:15 Uhr

Hallo an alle,
ich bin gerade dabei mich mal mit dem Obfuscator auseinander zu setzen, der beim Visual Studio 2005 mit kommt. Mit der Suche habe ich dann schon mal das hier gefunden, leider nichts zum Obfuscator von VS2005:
[FAQ] .net Assembly vor Disassembling schützen

Erste Frage hierzu: Was haltet ihr davon bzw. warum gibt es trotzdem so viele Dritt-Produkte?

Leider taucht der Obfuscator vom Visual Studio 2005 auch hier nicht auf:
PDF über Obfuscator-Techniken

Kennt jemand eine Anleitung wie ich mein Projekt mal so damit bearbeiten kann, dass es auch danach noch läuft. Aktuell produziere ich nur EXE, die danach nicht mehr laufen?

Danke und Gruß
Bonvie

15.02.2007 - 13:20 Uhr

Hallo falangkinjau,
erstmal danke für deine Hilfe und ja du hast mich richtig verstanden, allerdings hilft mir dein Ansatz nur bedingt, denn damit verschwindet der alternating Style.

Deswegen hatte ich bisher die Idee, nur die zu markierenden Zeilen mit dem Handler zu bearbeiten und die gerade sauber gemachten, dann "von Hand" mit dem richtigen Hintergrund zu versehen. An Letzterem hänge ich derzeit, auch wegen dem alternating Style.

Will heißen ich bin leider immer noch nicht weiter.

Danke und Gruß
Bonvie

15.02.2007 - 12:40 Uhr

Habe etwas gefunden. Ist zwar von hinten durch die Brust aber es funktioniert!
Für bessere Vorschläge bin ich immer zu haben 🙂

private DateTime RetrieveLinkerTimestamp()
{
    // according to [URL]http://www.codinghorror.com/blog/archives/000264.html[/URL]
    string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;
    const int c_PeHeaderOffset = 60;
    const int c_LinkerTimestampOffset = 8;
    byte[] b = new byte[2050];
    System.IO.Stream s = null;

    try
    {
        s = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
        s.Read(b, 0, 2048);
    }
    finally
    {
        if (s != null)
        {
            s.Close();
        }
    }

    int i = System.BitConverter.ToInt32(b, c_PeHeaderOffset);
    int secondsSince1970 = System.BitConverter.ToInt32(b, i + c_LinkerTimestampOffset);
    DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0);
    dt = dt.AddSeconds(secondsSince1970);
    dt = dt.AddHours(TimeZone.CurrentTimeZone.GetUtcOffset(dt).Hours);
    return dt;
}