Hallo,
Ich möchte in einer Listbox einen gewälten Bereich (Startelement wird mit Mausklick links selektiert, Endelement wird mit gehaltener <Shift> und Mausklick links selektiert) mit Drag & Drop kopieren.
Dazu nutze ich folgenden Code:
private void cLB_Data_MouseDown(object sender, MouseEventArgs e)
{
try
{
if (cLB_Data.Items.Count == 0) return;
if (cLB_Data.SelectedItems.Count == 0) return;
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
if (e.Clicks == 1)
{
string text = GetSelectetText();
DragDropEffects dde1 = DoDragDrop(text, DragDropEffects.All);
}
}
}
catch (Exception Exc)
{
MessageBox.Show(Exc.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
public string GetSelectetText()
{
try
{
string result = "";
if (cLB_Data.SelectedItems.Count > 0)
{
foreach (var item in cLB_Data.SelectedItems) result += item.ToString();
}
return result;
}
catch (Exception exc)
{
ShowFehler(exc.Message);
return "";
}
}
Merkwürdigerweise bekomme ich immer nur das erste selektierte Element zurück obwohl ein ganzer Bereich selektiert ist (dies habe ich durch setzen eines Breakpoints in cLB_Data_MouseDown() (noch vor dem try-Block) verifiziert
In diesem Moment ist der entsprechende Bereich blau selektiert, in "cLB_Data.SelectedItems" ist nur ein Element vorhanden.
Wie kann es sein das mehrere Items selektiert angezeigt werden, aber in der Liste nur ein Element vorhanden ist?
Gruß
M.
.
Hallo,
Danke für die Antwort.
Hab mein Programm auf meiner lokalen Platte getestet --> da läuft es einwandfrei, allerdings nützt es mir da auch nichts.
sd
Hallo,
Ich schlage mich z.Zt. mit dem FileSystemWatcher herum.
Soweit funktioniert das Programm: Löschungen von Dateien, neue Dateien, Umbenennungen, Größenänderungen etc. alles funktioniert, auch in den Unterverzeichnissen.
Was nicht funktioniert ist die Feststellung auf Änderungen in einer Datei. Hier wird eine Änderung nur gemeldet, wenn sie in einer Datei die im FileSystemWatcher.path liegt vorgenommen wurde. In den Unterverzeichnissen funktioniert es nicht mehr.
Is it a bug or is it a feature?
Kann mir jemand helfen, hab hier und im Netz keine Lösung gefunden.
Hier der Code:
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Security.Permissions;
using System.Net;
namespace FileGuard
{
public partial class Form1
{
#region Delegaten
delegate void SetTextCallback(string txt);
#endregion Delegaten
#region Konstruktor
public Form1()
{
InitializeComponent();
// Master NAS auf Änderungen Überwachen.
string source = "\\\\???.???.???.???\\Public";
NetworkConnection connection = new NetworkConnection(source, new NetworkCredential("nutzer", "passwort"));
using (connection)
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = source;
watcher.Filter = "*.*";
watcher.IncludeSubdirectories = true;
// zu überwachende Änderungen
watcher.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
// Eventhandler anlegen
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.Deleted += new FileSystemEventHandler(OnDeleted);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Überwachung starten
watcher.EnableRaisingEvents = true;
}
}
#endregion Konstruktor
#region Private
#region Ereignisse
private void OnChanged(object source, FileSystemEventArgs e)
{
ListBoxAus("Änderung: " + e.FullPath);
}
private void OnCreated(object source, FileSystemEventArgs e)
{
ListBoxAus("Neu: " + e.FullPath);
}
private void OnDeleted(object source, FileSystemEventArgs e)
{
ListBoxAus("gelöscht: " + e.FullPath);
}
private void OnRenamed(object source, RenamedEventArgs e)
{
ListBoxAus("Umbenannt: " + e.FullPath);
}
#endregion Ereignisse
private void ListBoxAus(string txt)
{
try
{
if (this.InvokeRequired)
{
BeginInvoke(new SetTextCallback(ListBoxAus), new object[] { txt });
return;
}
if (this.cLB_Changed.Items.Count > 1000) this.cLB_Changed.Items.Clear();
this.cLB_Changed.Items.Insert(0, txt);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message + "FileGuard::ListBoxAus()");
}
}
Hallo,
Danke für die Info, hatte ich fast befürchtet.
Leider muss die Sprache während des Programmlaufes geswitcht werden können.
Dann muss ich eben die weniger elegante Lösung über manuelles setzen der Beschriftungen gehen.
Schade.
lg
sd
Hallo,
Ich möchte die Möglichkeit nutzen meine Forms mehrsprachig zu gestalten.
(Localization = true und Language = standard, en_GB etc.). Das geht ja auch sehr komfortabel.
Leider habe ich bis jetzt noch keine Möglichkeit gefunden die Sprache während des Programmlaufes umzuschalten ohne den aktuellen Dialog zu "überbügeln". Um die Sprache zu ändern muss man ja, wenn ich das richtig verstanden habe, den Konstruktor neu aufrufen, also eine neue Instanz bilden:
public partial class sprache : Form
{
public sprache(string sprache)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(sprache);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(sprache);
InitializeComponent();
}
}
Gibt es eine Möglichkeit die Sprache in der alten Instanz zu wechseln (so eine Art Refresh), damit meine alte Instanz mit allen Eingabedaten erhalten bleibt?
lg
sd
Salve Gemeinde,
Ich möchte das TextBox-Steuerelement ableiten um für Touchscreens beim Eintritt in die Textbox eine Bildschirmtastatur (zur Eingabe in die entsprechende Textbox) einblenden zu können.
Das Control der Bildschirmtastatur funktioniert (ist schon getestet).
Wenn ich allerdings versuche die Bildschirmtastatur beim Eintritt in meine abgeleitetet TextBox anzeigen zu lassen geschieht gar nichts.
Beim Hineindebuggen sind alle Werte korrekt gesetzt aber es passiert nix.
Für eine kleine Hilfe wäre ich sehr dankbar.
Michael
Hier der relevante code:
namespace Autark.UI
{
public class AutarkTextBox : TextBox
{
#region Klassenvariablen
#endregion Klassenvariablen
/// <summary>
/// Erzeugt eine neue Instanz
/// </summary>
public AutarkTextBox()
{
}
protected override void OnEnter(EventArgs e)
{
base.OnEnter(e);
KeyBoard cAutarkKeyboard = new KeyBoard();
this.Controls.Add(cAutarkKeyboard);
cAutarkKeyboard.UseWith(this);
}
}
}
namespace Autark.UI
{
/// <summary>
/// Dieses Usercontroll stellt ein Bildschirmkyboard zur Dateneingabe über einen Touchscreen zur Verfügung.
/// </summary>
public partial class KeyBoard : AutarkUserControl
{
/// <summary>
/// Stellt das AutarkKeyboard Usercontrol als Tastatur für Eingaben auf einem Touchscreen zur Verfügung.
/// </summary>
/// <param name="textobject">Zu bearbeitendes Objekt</param>
public void UseWith(object textobject)
{
cTextObject = textobject;
if (cTextObject.GetType() == typeof(AutarkTextBox)) cMerkText = ((AutarkTextBox)cTextObject).Text;
else return;
TxtBoxPos = SelStart(); // Cursorzeiger setzen
// Tastaturposition
int b = SystemInformation.VirtualScreen.Width;
int h = SystemInformation.VirtualScreen.Height;
Point p = new Point(0, 0);
// absolute Koordinaten des Controls ermitteln
if (cTextObject.GetType() == typeof(AutarkTextBox)) p = ((AutarkTextBox)cTextObject).PointToScreen(new Point(0, 0));
else return;
// Position der Tastatur ermitteln
int kbd_bx = this.Width; // Breite Tastatur
int kbd_hx = this.Height; // Höhe Tastatur
int x = p.X, y = 0;
if (p.Y + kbd_hx > h) y = p.Y - kbd_hx - 23;
else y = p.Y;
if (p.X + kbd_bx > b) x = b - kbd_bx;
// Position der Tastatur setzen
this.Location = new Point(x, y);
this.Show();
this.BringToFront();
}
/// <summary>
/// Cursorposition im Eingabefeld ermitteln.
/// </summary>
/// <returns>Cursorposition</returns>
private int SelStart()
{
int CurPos = 0;
if (cTextObject.GetType() == typeof(AutarkTextBox)) CurPos = ((AutarkTextBox)cTextObject).SelectionStart;
return CurPos;
}
}
Hallo Christian,
Vielen Dank für Deine Hilfe.
Das war Spitze!
Jetzt funktioniert es einwandfrei.
Ich hoffe, dass ich mich mal erkenntlich zeigen kann.
lg
Michael
Salve Gemeinde,
Ich habe ein eigenes Farbschema für meine Dialoge entwickeln. Dazu habe ich die entsprechende Klasse von Windows.Forms abgeleitet. Der Dialoghintergrund hat einen Farbverlauf erhalten. Zur Aktualisierung habe ich die Methode "OnPaintBackground" überschrieben.
Das alles funktioniert im Prinzip auch ganz gut, aber leider bleibt nach einer Änderung der Dialoggröße der ursprüngliche Hintergrundteil erhalten. Es scheint so, als würde der neue Bildschirmhintergrund korrekt aufgebaut. Danach scheint aber der Ursprüngliche (mit den alten Clippings) nochmal "darübergezeichnet" zu werden.
Wenn ich den Dialog minimiere und wieder aktiviere funktioniert es korrekt.
Habe im Netz schon geraume Zeit gesucht aber keine Lösung gefunden.
Vielleicht hat einer von Euch ja eine Idee.
Vielen Dank für Eure Hilfe.
Michael
Hier der maßgebende Programmcode:
namespace Autark.UI
{
public partial class AutarkForm : Form
{
public AutarkForm()
{
InitializeComponent();
AutarkStil.SetStyle(this);
base.BackColor = AutarkFarben.SolidBackground;
}
...
protected override void OnPaintBackground(PaintEventArgs e)
{
Rectangle r = new Rectangle();
r.X = (int)e.Graphics.VisibleClipBounds.X;
r.Y = (int)e.Graphics.VisibleClipBounds.Y;
r.Width = (int)e.Graphics.VisibleClipBounds.Width;
r.Height = (int)e.Graphics.VisibleClipBounds.Height;
if (r.Height > 0 && r.Width > 0)
{
Point p1 = new Point(r.Width / 10, r.Height / 10);
Point p2 = new Point(r.Right, r.Bottom - (r.Height / 10));
LinearGradientBrush brush = new LinearGradientBrush(p1, p2, AutarkFarben.GradientStartBackground, AutarkFarben.GradientEndBackground);
brush.WrapMode = WrapMode.TileFlipXY;
e.Graphics.FillRectangle(brush, r);
}
}
Hallo,
Danke für Deine Hilfe.
Kaufen geht nicht. Orginalton meines Chefs: Das können wir selber machen. Wobei er immer vergisst, dass das noch teurer ist (wenn mann bedenkt was eine Ingenieurstunde kostet).
Beim anderen Link suche ich noch.
mfG
smalldevice
Hallo Gemeinde,
Ich bin neu hier, deshalb stelle ich mich erst mal vor, bevor ich Euch mit Fragen löchere.
Mein Name ist Michael, bin 51 Jahre, verheiratet, no Kids.
Ich bin Bauingenieur und arbeite seit 20 Jahren als Softwarentwickler in einer Firma, die Statik- und CAD-Software für die Baubranche entwickelt. Seit ca. einem Jahr entwickeln wir in .net/c#. Mit anderen Worten, ich bin noch Anfänger.
Hier nun mein Problem:
Ich möchte an eine Spalte eines DataGrid ein TreeView binden, finde aber nichts diesbezüglich (habe hier schon nachgeforscht und im Netz).
Das Grid ist über DataBinding an eine Datenklasse gebunden, die ein Feld entält, für das ich in der entsprechenden Spalte ein TreeView brauche. Man könnte das auch über eine Combobox machen was in diesem Fall aber unpraktisch ist, da hier ca. 200 Einträge angezeigt werden müssten. Die Daten bestehen aus 12 Hauptgruppen mit jeweils ca. 20 logisch zusammengehörigen Unterpunkten. Zum schnelleren Auffinden und auswählen des gewünschten Punktes wäre also ein Tree optimal.
Ich hoffe, dass Ihr mir helfen könnt.
mfg
smalldevice