this.Controls[StringFokus1].Focus();
this ist die form, die die textbox enthält
class A : ICloneable
{
public A Nachbar;
protected A(A a)
{
if(a.Nachbar != null)
this.Nachbar = a.Nachbar.Clone();
}
public object Clone()
{
return new A(this);
}
}
meinst du so? (code nicht getestet, nur runtergeschrieben).
kenn das control nicht, aber irgendwie invalidaten?
hmm, ich dachte jetzt eigentlich, es würde reichen, wenn du
protected void OnDeactivate(EventArgs e)
überschreibst. aber das bringt es nicht.
du könntest nen timer benutzten, der alle paar millisekunden this.Focus() aufruft
ich grab das nochmal aus, da es damit zu tun hat:
ab und an kommt es nun vor, dass ich die titelleiste anklicken muss, damit das mdi in den vordergrund kommt. das fenster wird zwar aktiviert, bekommt focus und alles, kommt aber nicht in den vordergrund.
jemand ne idee? diesemal liegt es nicht an WndProc.
Könnt mích jetzt irren, aber das CompareTo müsste in einem StackOverFlow enden, da du die gleiche Methode immer wieder aufrufst:
public int CompareTo(object obj) { return this.CompareTo(obj as ZorderForm); }
Du rufst CompareTo auf, und als Rückgabewert, soll er this.CompareTo aufrufen.
bein zweiten mal wird aber
public int CompareTo(ZorderForm other)
{
if (other == null)
throw new ArgumentNullException("other");
return this.ZOrder.CompareTo(other.ZOrder);
}
aufgerufen
keine kommentare?
hab noch IComparable implementiert um direkt sortieren zu können.
hab jetzt mal selbst was gemacht.
ist noch nicht ganz reif, aber auf die schnelle funzt es ...
public abstract class ZorderForm : Form, IComparable<ZorderForm>, IComparable
{
public event ZorderChangedEvent ZorderChanged;
private int m_zorder = 0;
private bool m_zorderSet = false;
public int ZOrder
{
get { return m_zorder; }
}
protected virtual void OnZorderChanged(ZorderChangedEventArgs e)
{
if (this.ZorderChanged != null)
this.ZorderChanged.Invoke(this, e);
}
private void SetZorder(int zorder)
{
m_zorderSet = true;
if (zorder != m_zorder)
{
ZorderChangedEventArgs e = new ZorderChangedEventArgs(m_zorder, zorder);
m_zorder = zorder;
this.OnZorderChanged(e);
}
// for testing
this.Text = "ZOrder: " + m_zorder;
}
private void UpdateZorders(Form[] forms)
{
if (forms != null)
{
foreach (Form f in forms)
{
ZorderForm z = f as ZorderForm;
if (z == null || ZorderForm.ReferenceEquals(z, this)) continue;
if (z.ZOrder > this.ZOrder && m_zorderSet) continue;
z.SetZorder(z.ZOrder + 1);
}
}
}
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
if (this.IsMdiChild)
this.UpdateZorders(this.MdiParent.MdiChildren);
else if (this.Owner != null)
this.UpdateZorders(this.Owner.OwnedForms);
this.SetZorder(0);
}
#region IComparable Members
public int CompareTo(object obj)
{
return this.CompareTo(obj as ZorderForm);
}
#endregion
#region IComparable<ZorderForm> Members
public int CompareTo(ZorderForm other)
{
if (other == null)
throw new ArgumentNullException("other");
return this.ZOrder.CompareTo(other.ZOrder);
}
#endregion
}
public class ZorderChangedEventArgs : EventArgs
{
public int OldZorder;
public int NewZorder;
public ZorderChangedEventArgs(int oldZorder, int newZorder)
{
this.OldZorder = oldZorder;
this.NewZorder = newZorder;
}
}
public delegate void ZorderChangedEvent(object sender, ZorderChangedEventArgs e);
ist jetzt die base-klasse all meiner formen
was haltet ihr davon?
(ein wenig verbessert)
Eine Form hat doch die Eigenschaft MDIChildren. An Index 0 steht die Form, die als erstes erzeugt wurde und an letzter Stelle, welches halt zuletzt erzeugt wurde.
das ist mir klar... aber bringt mir ja nicht viel. 🙂
eigentlich geht es mir nicht mal um die genaue z-order;
wenn es eine möglichkeit gibt, die mdi-childs so zu durchlaufen wie sie angeordnet sind.
also nicht alles, nur position, size, etcpp. und verschiedene zustände ... ist quasi als konfiguarzion gedacht. bei einem erneuten öffnen des programms kann man die konfiguration laden und es sieht alles so aus wie vroher ... fenster sind an den plätzen, wo sie waren bevor das programm geschlossen wurde
Hallo,
kann ich irgendwie die z-order eines mdi-childs ermitteln.
ich serializiere eine form und deren mdi's.
an sich klappt das, nur bei der z-order happert es. will beim restore, dass die z-order erhalten bleibt... wenn ich sie beim serialisieren weiss, könnte ich die mdi-childs daran sortieren und beim restore in der reihenfolge neu erstellen.
Hallo,
ich hab ein Conrol von TextBox abgeleitet und OnKeyDown überschrieben.
Ich würde gerne, wenn der User ein Komma eingibt (,), soll Komma + Space in der TextBox erscheinen.
hier mein code:
public string InsertText(string text)
{
return this.InsertText(text, this.SelectionStart, this.SelectionLength);
}
public string InsertText(string text, int start, int len)
{
string s = this.Text;
if (len > 0)
s = s.Remove(start, len);
this.Text = s.Insert(start, text);
this.SelectionStart = start + text.Length;
return this.Text;
}
protected override void OnKeyDown(KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Oemcomma:
this.InsertText(", ");
e.Handled = true;
break;
default:
base.OnKeyDown(e);
break;
}
}
leider wird nun ", ," eingefügt.
kann mir jemand sagen, warum das so ist?
wie äußert sich denn das fehlverhalten?
habs.
ich hab WndProc überschrieben, und dann teilweise nicht an base.WndProc weiter delegiert.
Hallo,
ich hab eine Mdi Form mt einzelnen mdi child forms.
komischerweise sind diese kinder nicht richtig aktivierbar.
d.h. ich kann zwar die controls in den kindern nutzen, aber die titelleiste des kindes hat immer die graue farbe - wie man sie von deaktiven fenstern kennt.
auch der Activated event wird nie gefeuert
hier der code
private void AddMdiChild(Form form, bool show)
{
form.MdiParent = this;
form.FormClosed += new FormClosedEventHandler(OnChildFormClosed);
form.Activated += new EventHandler(OnChildFormActivated);
if (show)
form.Show();
}
Hi.
hab ein MenuStripMenu mit nem ToolStripMenu; dessen DropDownItems werden beim Klick nur auf checked/unchecked gesetzt.
Wie schaffe ich es jetzt, dass die DropDownItems sichtbar bleiben, wenn ich ein einzelnes item checke/unchecke, so dass ich nacheinander items checken/unchecken kann ohne dass ich das menü wieder aufrufen muss.
Danke.
ich vermute, mit myHost.AddServiceEndpoint(typeof(IServerFunktionen), tcpBinding, "net.tcp://localhost:8888/AMLagerServer"); bindest du nur an localhost/127.0.0.1
ganz verstehe ich die frage nicht.
https funzt ja wie http, der client macht ne anfrage,
der server schickt sein zertifikat - und kann in diesem schritt ein zertifikat vom client verlangen.
aber ein server zertifikat muss immer geschickt werden.
ob der server ein client zertifikat haben will, ist im überlassen!
/* TransportHelper */
public static int SendMessage(Socket socket, TransportMessage message, out byte[] bytesSend)
{
byte[] msgBytes = message.ToBytes();
int retval = -1;
using (MemoryStream ms = new MemoryStream())
{
BinaryWriter bw = new BinaryWriter(ms);
bw.Write(msgBytes.Length);
bw.Write(msgBytes);
bytesSend = ms.ToArray();
retval = socket.Send(bytesSend);
}
return retval;
}
public static int SendMessage(Socket socket, TransportMessage msg, LogObject logObj)
{
int retval = -1;
if (msg != null)
{
byte[] bytesSend = null;
retval = TransportHelper.SendMessage(socket, msg, out bytesSend);
if (bytesSend != null)
{
logObj.LogInfo("Send {0} bytes", bytesSend.Length);
logObj.LogDebug("Bytes send: \n--- BEGIN HEXDUMP ---\n{0}--- END HEXDUMP ---", Util.HexDump(bytesSend));
}
}
return retval;
}
das war die sendfunktion... die dump ausgabe sehe ich immer, die daten kommen nicht an bzw. verspätet
hier der client receive
private void ConnectCallback(IAsyncResult ar)
{
try
{
TcpSocket socket = (TcpSocket)ar.AsyncState;
socket.EndConnect(ar);
this.SetStatus(StatusFlag.Online);
if (this.InvokeOnConnectionSuccess() || m_asyncReceive)
this.AsyncReceive();
}
catch (Exception e)
{
this.InvokeOnConnectionFailed(e);
}
finally
{
this.ProgressBarMarqueeStop();
}
}
protected void AsyncReceive()
{
this.AsyncReceive(new TransportAsyncState(m_socket, null));
}
protected void AsyncReceive(AsyncState state)
{
if (m_receiveCallback == null)
m_receiveCallback = new AsyncCallback(ReceiveCallback);
state.Socket.BeginReceive(state.ReceiveBuffer, 0, state.ReceiveBuffer.Length, SocketFlags.None, m_receiveCallback, state);
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
TransportAsyncState state = (TransportAsyncState)ar.AsyncState;
int length = state.Socket.EndReceive(ar);
// kommt nix an...
System.Diagnostics.Debug.WriteLine("ReceiveCallback: " + length);
if (length > 0)
{
state.ReceiveSync(length);
TransportMessage message = state.ReadMessage();
if (message != null)
{
TransportMessage resp = this.InvokeOnTransportClientReceived(message);
if (resp != null)
this.SendTransportMessage(resp);
}
}
this.AsyncReceive(state);
}
catch (Exception e)
{
this.InvokeOnReceiveFailed(e);
}
}
Also,
ich hab ein stranges verhalten.
ich sende von einem server daten an einen client.
beide laufen auf der gleichen maschine.
jetzt kommt es vor, dass ich zwar vom server daten an den client schicke, diese aber nie ankommen.
der client warten auf die daten asynchron... die daten kommen nie an bzw. manchmal kommen sie erst minuten später an... manchmal auch gar nicht.
ich weiß, nicht viel anhaltspunkte, aber vielleicht hat ja jemand eine idee!
ich kann den evnt abfangen (WM_CONTEXTMENU), aber ob ich jetzt auf die header oder listview clicke, kann ich niht sagen.
hab es auch mit
Point p = new Point();
p.X = (int)(m.LParam.ToInt32() & 0xFFFF);
p.Y = (int)(m.LParam.ToInt32() >> 16);
MessageBox.Show (this.RectangleToScreen (this.ClientRectangle).Contains (p).ToString ());
versucht, aber damit komm ich auch nicht weiter, da die haeder auch zum clientrect gehören
ah, danke! 😉
hab ich übersehen!
wenn es so einfach wäre: einsetzen der proerties width bzw. size, zeigt keinen effekt bzw. werden die breiten wieder zurück gesetzt
Moin,
ich hab ein ToolStrip.
Darin sind Buttons mit Eigenschaft TextImageRelation = ImageAboveText
Die Icons der Buttons haben zwar die selbe Breite (und Höhe), aber da die Beschriftung der einzelnen Buttons unterschiedlich Breit sind, sind auch die kompletten Buttons unterschiedlich breit.
Gibts ne Lösung dazu?
ich hab jetzt den statusstrip entfernt
stattdessen benutz ich jetzt ein TableLayouPanel mit Dock=Bottom, Rows=1
in die erste spalte kommt die progressbar, breite=100%
die spalten mit den bildern bekommen eine breite von 20px... das klappt dann
hth
ja, aber eine progressbar in dem statusstrip hat z.b. kein spring attribut.
oder ich bin zu beschränkt. 8o
private void StatusStrip_SizeChanged(object sender, EventArgs e)
{
this.SetProgressBarSize();
}
private void SetProgressBarSize()
{
int count = this.StatusStrip.Items.Count;
this.StatusStripProgressBar.Size = new Size(this.StatusStrip.ClientRectangle.Width - 5 - (count-1)*16, this.StatusStripProgressBar.Size.Height);
}
ich habe eine statusstrip.
erstes item ist eine progressbar.
alle nachfolgenden sind Images 16x16 (StatusLabel)
die progressbar soll immer so breit wie möglich sein, aber noch den platz von den icons frei lassen.
das resizen der progressbar klappt zusammen mit dem StatusStrip_SizeChanged event, aber leider bekommen die restlichen items des statusstrip die größen änderung der progressbar nicht mit und werden irgendwie nicht angezeigt.
weiß es jemand besser?
wenn e.Item == null, wuerde ich einfach nichts tun
zu den events:
klar, du kannst die venthandler immer wieder neu setzen (=), erweitern (+=) oder reduziern (-=)
manchmal muss man einfach mal ein paar naechte drueber schlafen.
wenn man dann noch alle exceptions, die man abfaengt, auswertet, kommt man selber auf das Problem. >)
trotzdem danke.
bringt es was, wenn du zuerst die liste fuellst und dann den event-handler setzt.
ist es die standard listview, die du verwendest, oder eine eigene?
hat niemand eine idee?
oder soll ich mal versuchen, ein minimal programm hochzuladen?
Also, ich habe eine TransportForm, die als basisklasse für versch. Fenster dient, die alle eine async verbindung zu einem server aufbaut und nachrrichten verschicken und empfangen kann
public partial class TransportForm : Form
{
private TcpSocket m_socket = null;
private AsyncCallback m_receiveCallback = null;
public TransportForm()
{
this.InitializeComponent();
}
protected void Connect()
{
this.ProgressBarMarqueeStart();
this.Disconnect();
this.Socket = new TcpSocket();
this.Socket.BeginConnect(TransportHelper.Host, TransportHelper.Port, new AsyncCallback(ConnectCallback), this.Socket);
}
protected void Disconnect()
{
if (this.Socket != null)
this.Socket.Close();
}
protected void AsyncReceive()
{
this.AsyncReceive(new TransportAsyncState(m_socket));
}
protected void AsyncReceive(AsyncState state)
{
if (m_receiveCallback == null)
m_receiveCallback = new AsyncCallback(ReceiveCallback);
state.Socket.BeginReceive(state.ReceiveBuffer, 0, state.ReceiveBuffer.Length, SocketFlags.None, m_receiveCallback, state);
}
private delegate bool ConnectionSuccessDelegate();
protected virtual bool OnConnectionSuccess()
{
return false;
}
protected virtual void OnConnectionFailed(Exception e)
{
}
private bool InvokeOnConnectionSuccess()
{
bool retval = false;
if (this.InvokeRequired)
{
ConnectionSuccessDelegate connectionSuccess = new ConnectionSuccessDelegate(this.InvokeOnConnectionSuccess);
retval = (bool)this.Invoke(connectionSuccess);
}
else
{
retval = this.OnConnectionSuccess();
}
return retval;
}
private delegate void ConnectionFailedDelegate(Exception e);
private void InvokeOnConnectionFailed(Exception e)
{
if (this.InvokeRequired)
{
ConnectionFailedDelegate connectionFailed = new ConnectionFailedDelegate(this.InvokeOnConnectionFailed);
this.Invoke(connectionFailed, new object[] { e });
}
else
{
this.OnConnectionFailed(e);
}
}
protected virtual void OnReceiveFailed(Exception e)
{
}
private void InvokeOnReceiveFailed(Exception e)
{
if (this.InvokeRequired)
{
ConnectionFailedDelegate connectionFailed = new ConnectionFailedDelegate(this.InvokeOnReceiveFailed);
this.Invoke(connectionFailed, new object[] { e });
}
else
{
this.OnConnectionFailed(e);
}
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
TransportAsyncState state = (TransportAsyncState)ar.AsyncState;
int length = state.Socket.EndReceive(ar);
if (length > 0)
{
state.ReceiveSync(length);
TransportMessage message = state.ReadMessage();
if (message != null)
{
TransportMessage resp = this.InvokeOnTransportClientReceived(message);
if (resp != null)
this.SendTransportMessage(resp);
}
}
this.AsyncReceive(state);
}
catch (Exception e)
{
this.InvokeOnReceiveFailed(e);
}
}
private delegate void StatusStripProgressBarUpdateVoid();
private delegate void StatusStripProgressBarUpdateInt(int value);
protected void ProgressBarMarqueeStart()
{
if (this.InvokeRequired)
{
StatusStripProgressBarUpdateVoid updateProgressBar = new StatusStripProgressBarUpdateVoid(this.ProgressBarMarqueeStart);
this.Invoke(updateProgressBar);
}
else
{
this.StatusStripProgressBar.MarqueeAnimationSpeed = 100;
this.StatusStripProgressBar.Style = ProgressBarStyle.Marquee;
}
}
protected void ProgressBarMaximum(int value)
{
if (this.InvokeRequired)
{
StatusStripProgressBarUpdateInt updateProgressBar = new StatusStripProgressBarUpdateInt(this.ProgressBarMaximum);
this.Invoke(updateProgressBar, new object[] { value });
}
else
{
this.StatusStripProgressBar.Maximum = value;
}
}
protected void ProgressBarValue(int value)
{
if (this.InvokeRequired)
{
StatusStripProgressBarUpdateInt updateProgressBar = new StatusStripProgressBarUpdateInt(this.ProgressBarValue);
this.Invoke(updateProgressBar, new object[] { value });
}
else
{
this.StatusStripProgressBar.Value = value;
}
}
protected void ProgressBarClear()
{
this.ProgressBarValue(0);
}
protected void ProgressBarMarqueeStop()
{
if (this.InvokeRequired)
{
StatusStripProgressBarUpdateVoid updateProgressBar = new StatusStripProgressBarUpdateVoid(this.ProgressBarMarqueeStop);
this.Invoke(updateProgressBar);
}
else
{
this.ProgressBarClear();
this.StatusStripProgressBar.MarqueeAnimationSpeed = 0;
this.StatusStripProgressBar.Style = ProgressBarStyle.Blocks;
}
}
private void ConnectCallback(IAsyncResult ar)
{
try
{
this.Socket.EndConnect(ar);
if(this.InvokeOnConnectionSuccess())
this.AsyncReceive();
}
catch (Exception e)
{
this.InvokeOnConnectionFailed(e);
}
finally
{
this.ProgressBarMarqueeStop();
}
}
private delegate TransportMessage AsyncOnTransportClientReceived(TransportMessage msg);
private TransportMessage InvokeOnTransportClientReceived(TransportMessage msg)
{
TransportMessage retval;
if (this.InvokeRequired)
{
AsyncOnTransportClientReceived callback = new AsyncOnTransportClientReceived(this.InvokeOnTransportClientReceived);
retval = (TransportMessage)this.Invoke(callback, new object[] { msg });
}
else
{
retval = OnTransportClientReceived(msg);
}
return retval;
}
protected virtual TransportMessage OnTransportClientReceived(TransportMessage msg)
{
return null;
}
private void TransportForm_Load(object sender, EventArgs e)
{
if (this.SizeGripStyle == SizeGripStyle.Show)
this.StatusStrip.SizingGrip = true;
this.SetProgressBarSize();
this.StatusStrip.SizeChanged += new EventHandler(StatusStrip_SizeChanged);
}
private void StatusStrip_SizeChanged(object sender, EventArgs e)
{
this.SetProgressBarSize();
}
private void SetProgressBarSize()
{
this.StatusStripProgressBar.Size = new Size(this.StatusStrip.ClientRectangle.Width - 45, this.StatusStripProgressBar.Size.Height);
}
public TcpSocket Socket
{
get { return m_socket; }
set { m_socket = value; }
}
public int SendTransportMessage(TransportMessage message)
{
return TransportHelper.SendMessage(this.Socket, message);
}
}
ein fenster leitet also von dieser Form ab und überschreibt die funktion OnTransportClientReceived, die über InvokeOnTransportClientReceived richtig aufgerufen werden sollte (also, so, dass der richtige thread auf die fenster zugreifen sollte).
leider hängt es irgendwo; heißt, die ListView wird nicht richtig gefüllt.
private void InsertStrategy(Strategy s)
{
ListViewItem item = new ListViewItem(new string[] { s.Id, s.Category, "" });
StrategiesListView.Items.Add(item);
}
private TransportMessage HandleRetrieveStrategiesResult(TransportMessage msg)
{
int count = msg.GetIntegerValue("COUNT");
this.ProgressBarClear();
this.ProgressBarMaximum(count);
for (int i = 0; i < count; i++)
{
string unique = msg.GetStringValue("UNIQUE", i);
string data = msg.GetStringValue("DATA", i);
Strategy s = new XmlStrategy(unique, data);
this.InsertStrategy(s);
this.ProgressBarValue(i + 1);
}
//this.StrategiesView.Update();
return null;
}
protected override TransportMessage OnTransportClientReceived(TransportMessage msg)
{
TransportMessage resp = null;
switch (msg.MessageType)
{
case TransportMessageType.RetrieveStrategiesResult:
resp = this.HandleRetrieveStrategiesResult(msg);
break;
}
return resp;
}
die schleife von i bis count iteriert nur einmal; progressbar wird abgedatet, aber kein item erscheint in der liste.
wenn ich die funktion InsertStrategy nicht aufrufe, füllt sich die progressbar komplett
sieht jemand meinen denkfehler?
Bringt nix.
hat noch jemand einen anderen vorschlag?
Hallo,
ich hab ein Windows.Form geschrieben, die ich mit dem Designer konfiguriert habe.
Die Form ist schon relative mächtig.
Jetzt habe ich das Problem, dass der Designer abstürzt, wenn ich ein bestehendes Control änder oder ein neues hinzufüge. Zuerst wird die komplette CPU verbraucht und dann - nach etwa 2 Minuten - meldet sich der Dr. Watson.
Frage: kann man den Code vom Designer irgendwie neu berechnen lassen, da ich denke, dass er verschiedene Controls im Code nicht mehr findet (anzeigen tut er noch alles normal). Oder meint ihr, es bringt was auf das neue VS zu migrieren und das es dann bei der Projekt--Migration wieder gerade gebogen wird!?!
Ich benutze ein externes Modul, dass leider auf einem File arbeitet.
kannst du mal versuchen, ein minimal bespiel zu erzeugen, in dem man dein Problem nachvollziehen kann?
Hast du die Doppelt-Verkettete-Liste-Klasse selbst erstellt?
Oder benutzt du irgendwas fertiges?
Ich weiß nicht, wie du deine Klasse implementiert hast. Aber das einfachste (nicht schnellste - hängt von deiner Implementierung ab) wird sein, die Liste in ein Array zu schreiben, dieses zu sortieren, und wieder neu aufzubauen.
ist form2 vom selben typ wie form1 ?
und was genau ist form1, form2?
du erlaubst anscheinend Anonymous Access im IIS auf deine WebApplication.
Dadurch weiß der IIS nicht, wer gerade die Seite aufruft-
Also mach einfach das Anonymous Access aus (irgendwo im Security Tab) und stell Windoows Authentication ein. Dadurch machst du dann NTLM, also bekommst du alles was du brauchst um dich als dieser User zu impersonifizieren!
Stimmt eigentlich: hab es jetzt mit einer internal Loader Klasse gemacht, die ich als static Object initialisiere... der Konstruktur macht dann die ganze Arbeit.
Ich hab dieser Klasse jetzt einfach einen Destruktor gegeben (also wirklich ~Loader() ) ... ist ja kein guter Stil - ist es für sowas in Ordnung oder soll ich es besser Disposable machen ?
Original von interzone
bekomm ich dann leider beim serialisieren den fehler, dass irgendwas nicht serializable gesetzt worden ist... 😭
Beschreib "irgendetwas" mal etwas genauer! 🙂