Ein kleiner tip. Wenn du dir keine eigene Lösung bauen willst, dann füge einfach ein leeres also transparentes Icon in die ImageList und dann setz den index auf genau dieses Icon. Das ist zwar nicht schön aber selten und es funktioniert.
Ok in diesem speziellen Fall ist es sinnvoll das man direkt in Form1 das Close der Form2 aufruft.
Man sollte sowas über Events lösen. Daher Form2 sollte sich an einem CloseEvent der Form1 anmelden, und Form1 feuert dieses dann nur noch. Siehe dazu Kommunikation zwischen 2 Forms.
Als kleine Anmerkung neben bei, Umlaute sind im Code nicht erwünscht...!
Wenn du die Pens alle mit einmal Initialisieren willst schau dir mal den out Parameter an.
Als erstes mal solltest du uns sagen was das für eine Anwendung ist. Du könntest in dem catch block einen bool wert z.B. isError auf true setzen. Und dann in der Aufrufenden Funktion das Programm beenden. Wenn du dann nämlich z.B. in der Main bist sollte es kein Problem sein. Bist du in einer Form kannst du mit .Close() die Form Closen und landest dann dort wo du Form.Show() aufgerufen hast und kannst eventuell auf den isError reagieren.
Jedes Control das von Control abgeleitet ist, dazu zählt auch der Button hat eine Property namens ENABLE.
Setzt die auf false und der Button ist disabled. Im übrigen eine einfach suche in der MSDN hätte dir schon geholfen...
Hallo herbivore,
so gehts natürlich auch. Danke euch
Also wenn ich deinen Pattern mit RegexLab teste dann kommt folgendes raus. Und das entspricht ja nicht dem was ich will.
[Edit] So funktioniert es
[#]*?$
Der Ausdruck ist kürzer als meiner 😃
Ich versteh das Problem ehrlich gesagt auch nicht. Wenn du in Form2 einen Dialog öffnest, und du den Dialog dann schließt, dann landest du doch nicht in Form1. Das ist mir ein Rätsel wie das gehen soll?!?!?
Dabei spielt es keine Rolle ob du Form2 aus igendeiner anderen Form heraus öffnest. Aber vielleicht verstehe ich dich falsch und du meinst etwas anderes...
So wie du es machst bekommst du keine "einzelnen" Zeilen, das ist das Problem. Du kannst mir gern das Gegenteil beweisen!
Ok das detail habe ich übersehen.
"^[^#][^#]*$[^#]"
Genau das ist ja das Problem. Ich will alle Zeichen bis auf #. Aber wie formuliert man das in Regex?
Die Regex Optionen kenne ich, Multiline und Singleline. Ich möchte aber jede einzellne Zeile habe. Sprich der Regex soll an einer Zeile beginnen, dannn bis zum Zeilenende aber kein # enthalten.
Hallo zusammen ich hab grad ein regex Problem.
Ich möchte in einem Text jede Zeile finden die kein "#" enthält.
Daher
sadfadsfgasdgafg#afdgydfg
adfgadfgsfdla
adfgdsfgsdfg#dgdfg
sdfsdfsdf
Der regex soll also 2 matches haben. Nämlich Zeile 2 und 4. Aber ich bekomm den nicht hin.
Ich dachte an [^#.]* aber das funktioniert nicht.
Kann mir jemand helfen?
Hast du mal folgendes ausprobiert MSDN Auszug. Kommst du so an das Item ran?
Nicht generische Listen sollten m.E. nicht mehr benutzt werden.
Hallo Seba1986,
und Willkommen hier im Forum. Was hast du denn bis jetzt raus gefunden? Was willst du den versenden (Daten?). Ein Stichwort für dich wäre z.B. EVENTING.
Mal nebenbei ich hab das Gefühl du liest dir die Artikel/Threads gar nicht durch, kann das sein?
Und zu deinem Code, den find ich schon sehr verwirrend
Wieso haben v98 un v99 die selbe Signature, machen aber was anderes (geschuldet der Tatsache das sie 2 mal auftauchen)?
Man sollte versuchen "sprechende" Methodennamen zu verwenden.
Das sind aber Grundlagen und gehören M.E. zu Wie poste ich richtig Punkt 1.1.1
Hallo zusammne,
ich hab eine Assembly die Sprachabhängige Satellite Assemblies hat. (EN-DE)
Nun möchte ich gern einen "string" der Englischen Resource anpassen, ich hab aber den Code nicht, daher ich kann den nicht im Studio ändern. Deswegen brauche ich einen Editor der es mit Erlaubt Teile der Resourcen zu ändern, und zu speichern. Geht sowas bzw. gibt es sowas, und wenns geht für free!
Danke im vorraus.
Die Idee ist nicht schlecht, nur musst du ausprobieren ob du damit den Effekt gut hin bekommst. Du kannst auch zusätzlich den Alpha Kanal des Panels auf 0 setzen und dann langsam an 255 annähern, dann blendet sich das Panel auch von der Transparenz mit ein. Eventuell wirkt es dann flüssiger.
Hast du es mal mit MouseDown probiert? Und dort kannst du dir ein Flag setzen und merken ob die rechte Maustaste gedrückt wurde, und entsprechend im MouseUp event darauf reagieren.
Du gehst damit niemand auf den Geist 😃
Ich geb dir voll und ganz recht, für Tabellendarstellung ist das DGV einfach besser geeignet, das ListView ist zwar leichter zu "handeln", aber das DGV dafür deutlich mächtiger. Nicht zu vergessen die Performance, die beim DGV gegenüber dem ListView auch nicht unerheblich ist.
Das wollt ich auch grad hinzufügen herbivore. Damit ist alles gesagt...
Doch es geht ohne schleife! Prüfe doch mit Regex auf den Anfang des Strings und dann nur Digits. Das müsste also auch gehen.
public int atoi(string source)
{
Regex regex = new Regex(@"^([-\d]\d*)");
Match match = regex.Match(source);
if (string.IsNullOrEmpty(match.Value))
{
throw new ArgumentException("The string does not contain digits.");
}
return Int32.Parse(match.Value);
}
[Edit] Hatte das minus vergessen mit zu Parsen.
Ja das geht mit Regex.
Regex re = new Regex("(?<=Herbert).*?(?=Stefan)");
re.Replace(soruce, string.empty);
Stichwort positver Lookahead und positiver Lookbehind.
(?≤(regex),(?=(regex), dadurch sucht die Enginge den regex, aber er gehört nicht zum match.
am rande: Die textboxen die ich setzen will sind zu diesem zeitpunkt unsichtbar, könnte es damit zu tun haben?
Nein du kannst generell keine Steuerelemente von einen anderen Thread, als den der sie erstellt, hat updaten. Benutze dazu immer ein Delegate. Schau dir auch mal den Thread an, sollte dir helfen.
Ok, ändere den Titel bitte noch in [gelöst] ab.
Dann musst du wohl selber eine TextBox zeichnen. Das ist ja nicht so schwer. Und dort dann deine Schriftart verwenden.
Das stimmt, aber da du schreibst ich werde "aber" meine Lösung weiter benutzten, schließe ich daraus das deine Lösung Vorteile hat. Lass uns an diesen Vorteilen teilhaben.
Schau ob das bild richtig gesetzt wird. Am einfachsten du lädst es mal schnell in eine PictureBox und schaust ob es angezeigt wird. Wenn du die ListView im Detailed view anzeigen möchtest, also z.B. mit mehreren Spalten, dann musst du die Bilder selber zeichnen. HAb mal ein kleines Beispiel angehängt.
public class ImageListView : ListView
{
private ImageList m_imageList;
public ImageListView()
{
this.OwnerDraw = true;
}
public ImageList DetailImageList
{
get
{
return this.m_imageList;
}
set
{
this.m_imageList = value;
}
}
protected override void OnDrawItem(DrawListViewItemEventArgs e)
{
base.OnDrawItem(e);
}
protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
{
base.OnDrawColumnHeader(e);
e.DrawBackground();
using (SolidBrush brush = new SolidBrush(this.ForeColor))
{
e.Graphics.DrawString(e.Header.Text, this.Font, brush, e.Bounds.Location);
}
}
protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
base.OnDrawSubItem(e);
e.DrawBackground();
using (SolidBrush brush = new SolidBrush(this.ForeColor))
{
e.Graphics.DrawString(e.SubItem.Text, this.Font, brush,
e.Bounds.Location.X + this.DetailImageList.Images[0].Width,
e.Bounds.Location.Y);
e.Graphics.DrawImage(this.DetailImageList.Images[0],
e.Bounds.Location.X,
e.Bounds.Location.Y);
}
}
}
Es wird noch keine Selction und Focus beachtet. Auch müsstest du die SubItem Klasse ableiten und ihr ein ImageIndex verpassen sodass du jeweils das richtige Image zeichnest.
Hallo joschika77,
sorry wenn ich das so sage, aber wer lesen kann ist klar im Vorteil. Guckst du ListView.LargeImageList-Eigenschaft.
This will fix the problem
this.myArticleLv.View = View.LargeIcon;
grüße rollerfreak2
Werde aber meine eigene weiterbenutzen und nur auf "Rectangle rect = this.GetTabRect(i);" zurückgreifen.
Aber du hattest doch gar keine eigene Lösung, wieso dann also weiterbenutzen? Unsere (die von ErfinderDesRades und mir) funktioniert doch einwandfrei, was gibt es daran auszusetzen?
Das ist mir schon klar das ein Koordinatensystem wie man es aus dem Matheunterricht kennt in Abzissenrichtung nach oben wächst. Aber wenn man den Mittelpunkt von oben Links in die Mitte verlagert, dann ist es nun mal so wie ich beschrieben habe.
@ErfinderDesRades
Das ist äquivalent zu meiner Lösung 😃
Dann hast du das aber meiner Meinung nach falsch beschrieben. Du hast ein Koordinatensystem das bei 0,0 nach oben wächst. Wenn du aber einen Punkt verschiebst, so wie du das erklärt hast, dann ist der obere linke Punkt im Ordinate sowie Abzisse negativ, oder hab ich da einen Denkfehler drin...
Schau dir mal die Signature der AddDay methode an
DateTime AddDay(int days);
Daher ändert das AddDays an der aufrufenden Instanz rein gar nix. Stattdessen musst du
datumAnfang = datumAnfang.AddDays(j);
Auch den vergleich versteh ich nicht. Daher warum scheirbst du
datumAnfang.ToShortDateString() == datumEnde.ToShortDateString()
Da die Uhrzeit doch keine Rolle spielt ist doch das völlig ausreichend
datumAnfang == datumEnde
Ein Lösung wäre die so ein Teil selber zu bauen. Mit hilfe einer Textbox und einer Scrollbar. Like this
private void InitializeComponent()
{
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.textBox1 = new System.Windows.Forms.TextBox();
this.vScrollBar1 = new System.Windows.Forms.VScrollBar();
//
// textBox1
//
this.textBox1.Font = new System.Drawing.Font("Tahoma", 18F, System.Drawing.FontStyle.Regular);
this.textBox1.Location = new System.Drawing.Point(32, 40);
this.textBox1.Size = new System.Drawing.Size(128, 44);
this.textBox1.Text = "textBox1";
//
// vScrollBar1
//
this.vScrollBar1.Location = new System.Drawing.Point(160, 40);
this.vScrollBar1.Maximum = 91;
this.vScrollBar1.Size = new System.Drawing.Size(32, 36);
this.vScrollBar1.ValueChanged += new System.EventHandler(this.vScrollBar1_ValueChanged);
//
// Form1
//
this.Controls.Add(this.vScrollBar1);
this.Controls.Add(this.textBox1);
this.Menu = this.mainMenu1;
this.Text = "Form1";
}
private void vScrollBar1_ValueChanged(object sender, System.EventArgs e)
{
this.textBox1.Text = this.vScrollBar1.Value.ToString();
}
Poste mal den Code für das Label.
[edit] steht ja schon oben, sry
@Trekki1990
Was willst du mir damit sagen?
Also Obere linke eckte muss doch doppelt negativ sein, -512, -384 oder seh ich da was falsch?
Das umrechnen ist doch nicht schwer! Ein paar Mathe Grundrechenarten und fertig.
Daher wenn du ein Punkt hast Bsp. (30, 40) und du willst den (0,0) Punkt in den Mittelpunkt schieben und wissen wo der (30, 40) jetzt liegt musst du doch nur
Point p = new Point(30 - this.Width / 2, 40 - this.Heigth / 2);
schreiben. War das wirklich so schwer oder hab ich dich einfach nur falsch verstanden?
Das beantwortet meine Frage nicht. Was passiert wenn du den Font des NumericUpDown Controls auf den von dir gewünschten setzt? Das es beim Label klappt spielt hierbei keine Rolle, ich möcht wissen was passiert wenn du es beim NUD Control äquivalent implementierst.
Hallo bonzy,
ich hab dir mal ne Lösung gepostet, die ist meines Erachtens nach gar nicht schwer ist daher leicht zu verstehen ist. Du hängst dich an das MouseClick Event und schaust welcher Button geclickt wurde. Danach überprüfst du ob der User ein TabPage (Reiter) gekickt hat. Ist dies der Fall dann öffnest du ein ContextMenu wobei du die Tabpage gleich mit an die TagProperty hängst. Danach musst du im OnClick des MenuItems nur noch die Tabpage removen. Und fertig!
public class ClickableTabControl : TabControl
{
/// <summary>
/// Raises the <see cref="E:System.Windows.Forms.Control.MouseClick"/> event.
/// </summary>
/// <param name="e">An <see cref="T:System.Windows.Forms.MouseEventArgs"/> that contains the event data.</param>
protected override void OnMouseClick(MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
for (int i = 0; i < this.TabCount; i++)
{
if (TabPageClicked(e.Location, i))
{
ContextMenu menu = new ContextMenu();
MenuItem item = new MenuItem("Close", new EventHandler(CloseClick));
item.Tag = this.TabPages[i];
menu.MenuItems.Add(item);
menu.Show(this, e.Location);
}
}
}
base.OnMouseClick(e);
}
/// <summary>
/// Closes the tabpage the user specified.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
private void CloseClick(object sender, EventArgs e)
{
MenuItem item = sender as MenuItem;
if (item != null)
{
TabPage page = item.Tag as TabPage;
if (page != null)
{
this.TabPages.Remove(page);
}
}
}
/// <summary>
/// Return true if the tabpage which with the given index was clicked.
/// </summary>
/// <param name="point">The point.</param>
/// <param name="i">The i.</param>
/// <returns></returns>
private bool TabPageClicked(Point point, int i)
{
Rectangle rect = this.GetTabRect(i);
return rect.Contains(point);
}
}
Dein Problem kann ich nicht nachvollziehen. Man kann auf jeden Fall Controls per Designer hinzufügen und im nachhinein Controls per Code. Man darf dies nur nicht im Designer Code tun.
Und wenn du wie Herbivore bereits gesagt hat die Controls auch in die Groupbox einfügst dann sind die auch relativ zu Groupbox.
public Form1()
{
InitializeComponent();
InitializeControls();
}
public void InitializeControls()
{
//here you can add what ever you want
}
public void InitializeComponent()
{
//but not here
....
}
Das stimmt nicht ganz! Und zwar ist das OnColumnWidthChanging Event dafür da mitzubekommen wenn der User dabei ist die Breite zu ändern. Daher wenn du dort
e.Cancel = true;
schreibst, dann wird einfach nur nicht die neue breite gezeichnet. Wenn du nun noch das OnColumnWidthChanged Event abfängst kannst du dort einfach die Breite zurück setzen.
foreach (ColumnHeader column in listView.Columns)
{
column.Tag = column.Width;
}
void listViewColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
{
listView.Columns[e.ColumnIndex].Width = (int)listView.Columns[e.ColumnIndex].Tag;
}
void listViewColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
{
e.Cancel = true;
}
So funktioniert es und ich find es sauberer, weil du nur dann die breite neu setzt wenn der User die Maus los lässt.
So find ich es akzeptabel. Ich fand nur die Lösung mit der MessageBox komisch. Jedesmal wenn der USer die Column Resizen will blobt eine MessageBox auf. In wie weit die Zeile
e.NewWidth = pingListView.Columns[e.ColumnIndex].Width;
nötig ist weiß ich nicht, weil doch eigentlich das e.cancel den Changing vorgang unterbindet.
Also mir kommt es vor als ob dir die Grundlagen fehlen. Du weist anscheinend nicht wie man mit Datenbanken umgeht, bzw was ein DataSet und Co. ist.
Dabei hat dir juetho alle nötigen Informationen gegeben. Die ignorierst du aber und versuchst die Arbeit auf uns abzuwelzen.
Wir helfen dir gern, aber du musst 1tens selber was dafür tun, und 2tens KONKRETE Fragen stellen, und nicht
aber ich weiß einfach nicht wie ich das programmieren muss
Noch mal kurz zu dem UseCompatibleTextRendering, das heißt wenn du den Font einach setzt mit
this.Font = new Font(...);
würd die neue Schrift nicht dargestellt weil zum Darstellen dieser Schrift dieses UseCompatibleTextRendering benötigt wird?
damit der Anwender sie nicht mehr verschieben kann
Gelöst würde ich das zwar nicht nennen aber so wird es auch verhindert. Nur schön finde ich das nicht.
Ich würde das Control ableiten und selber umbauen, also z.B. das OnPaint überschreiben. Dort kannst du dann selber die Zahlen zeichnen und die Digitale Schrift einsetzten.
Den Anfang habe ich dir doch schon gegeben. Die DB solltest du zuerst überdenken. Und dann selber mal bisschen was suchen....