Donnerstag, Mai 12, 2005

SelectedRows in C1TrueDBGrid

Folgendes Problem:

Wenn man in einem C1TrueDBGrid herumklickt, dann wird die Zeile zwar durch den MarqueeStyle (HighlightRow) zwar hervorgehoben, jedoch nicht in die SelectedRows-Collection aufgenommen. Selber bin ich nicht auf eine perfekte Lösung des Problems gekommen, bis ich diesen Artikel fand:

Newsgroup Article Component1.public.net.tdbgrid:4769

Ich musste ihn etwas abwandeln, da er keine Tastaturnavigation berücksichtigte. Also MarqueeStyle auf NoMarquee stellen und folgenden Code einfügen:



Private Sub TDBPersonenAdressen_SelChange(ByVal sender As Object, ByVal e As C1.Win.C1TrueDBGrid.CancelEventArgs) Handles TDBPersonenAdressen.SelChange
' UpdateButttons()
e.Cancel = True
End Sub

Private Sub TDBPersonenAdressen_RowColChange(ByVal sender As Object, ByVal e As C1.Win.C1TrueDBGrid.RowColChangeEventArgs) Handles TDBPersonenAdressen.RowColChange
Dim aRow As Integer
Dim aSelectedRow As Integer

Try
aSelectedRow = TDBPersonenAdressen.Row ' TDBPersonenAdressen.RowContaining(e.Y)
If e.LastRow <> aSelectedRow Then

If (Control.ModifierKeys And Keys.Control) > 0 Then
If TDBPersonenAdressen.SelectedRows.IndexOf(aSelectedRow) > -1 Then
If TDBPersonenAdressen.SelectedRows.Count > 1 Then
TDBPersonenAdressen.SelectedRows.RemoveAt(TDBPersonenAdressen.SelectedRows.IndexOf(aSelectedRow))
End If
Else
TDBPersonenAdressen.SelectedRows.Add(aSelectedRow)
End If
Else
If (Control.ModifierKeys And Keys.Shift) > 0 Then
For aRow = (TDBPersonenAdressen.SelectedRows.Count - 1) To 1 Step -1
TDBPersonenAdressen.SelectedRows.RemoveAt(aRow)
Next

If TDBPersonenAdressen.SelectedRows.Count > 0 Then
If TDBPersonenAdressen.SelectedRows(0) > aSelectedRow Then
For aRow = TDBPersonenAdressen.SelectedRows(0) To aSelectedRow Step -1
If TDBPersonenAdressen.SelectedRows.IndexOf(aRow) > -1 Then
TDBPersonenAdressen.SelectedRows.RemoveAt(TDBPersonenAdressen.SelectedRows.IndexOf(aRow))
End If

TDBPersonenAdressen.SelectedRows.Add(aRow)
Next
Else
For aRow = TDBPersonenAdressen.SelectedRows(0) To aSelectedRow
If TDBPersonenAdressen.SelectedRows.IndexOf(aRow) > -1 Then
TDBPersonenAdressen.SelectedRows.RemoveAt(TDBPersonenAdressen.SelectedRows.IndexOf(aRow))
End If

TDBPersonenAdressen.SelectedRows.Add(aRow)
Next
End If
End If
Else
TDBPersonenAdressen.SelectedRows.Clear()
TDBPersonenAdressen.SelectedRows.Add(aSelectedRow)
End If
End If

RaiseEvent SelectionChanged(Me, EventArgs.Empty)
End If
Catch ex As Exception
Debug.WriteLine(ex.ToString)
End Try
End Sub



Mittwoch, Mai 11, 2005

HTML und plain text in mit System.Web.Mail verschicken

Laut ASP.extra soll man folgenden Header hinzufügen:

objMessage.Headers.Add("content-type", "multipart/alternative")

Laut http://www.systemwebmail.com/faq/3.7.aspx wird eine plain text Version automatisch erstellt. So verliefen auch meine Tests.

Tolle FAQ zu System.Web.Mail

Dienstag, Mai 10, 2005

The Code Project - SMTP Authentication using System.Web.Mail (CDOSYS) - .NET

The Code Project - SMTP Authentication using System.Web.Mail (CDOSYS) - .NET

Montag, Mai 09, 2005

CodeDom - MemberAttributes und TypeAttributes

Part V: Other General Items Of Interest

Sonntag, Mai 08, 2005

Probleme mit Datenbindung

Ich hab jetzt sicher einige Stunden nach einem Fehler gesucht. Das hat mich fast in den Wahnsinn getrieben. Ich hatte folgendes Problem:

Bei .NET habe ich ein Fenster mit gebundenen Daten. Dabei sollten, wenn die Liste leer ist, die Controls entsprechend deaktiviert werden. Also habe ich den CurrencyManager an PositionChanged gebunden. Irgendwann (vor ein paar Tagen) hat es sicher schon mal funktioniert. Jetzt klappt das nicht mehr. Er schien irgendwo ein Event zu verschlucken. Ein PositionChanged kam irgendwie nicht mehr durch
Um es kurz zu machen: Ich hatte in der letzten Zeit ein weiteres Control an die Liste gebunden. Außerdem war mit dem Control ein Eventhandler verbunden. Innerhalb des EventHandlers trat ein Fehler auf, der nicht gemeldet wurde (ist so eine Eigenart bei Events, die mit dem CurrencyManager zusammenhängen). Dadurch wurden weitere Events irgendwie nicht mehr registriert bzw. durchgelassen.

Fazit: Alle Ereignisroutinen mit einem Try...Catch ausrüsten, um dann wenigstens mit einem Debug.WriteLine(ex.ToString) irgendwie von dem Fehler Notiz zu bekommen.

Donnerstag, Mai 05, 2005

Visual Designer von Visual Studio.NET

Ich hatte dieses Problem schon mal, hab es gelöst, hab mir aber nicht notiert, wie...

Das tue ich hiermit: Beim Erben eines Windows.Form-Objekts kam im Designer immer die Fehlermeldung NullReferenceException oder ähnliche. Dies liegt daran, dass im Basis-Form in einem Event oder einer überschriebenen Methode ein Objekt angesprochen wird, das für den Designer noch nicht deklariert ist. Beispiel:

Public Class BaseForm
Inherits Windows.Forms.Form

#Region "Windows Form Designer generated code "
' ...
#End Region

Private obj as Object

'Ein weiterer Konstruktor, der das Objekt erst initialisiert
Public Sub New(ByVal parameter as Object)
Me.New()

obj = New Object()
End Sub

Protected Overrides Sub OnVisibleChanged(ByVal e As System.EventArgs)
MyBase.OnVisibleChanged(e)

obj.MethodCall()
End Sub
End Class

Wird von diesem Form geerbt, dann wird OnVisibleChanged aufgerufen, sobald der Designer geöffnet wird, was zur Folge hat, dass der Aufruf für das nicht initialisierte Objekt obj zu einer NullReferenceException führt. Natürlich gibt es auch das Problem beim entsprechenden Event. Weitere momentan mir bekannte Events bzw. überschreibbare Methoden, die zu diesen Problemen führen, sind Load bzw. OnLoad.

Gelöst werden kann das ganze einfach durch ein einschließen des problematischen Codeblocks mit folgender Bedingung:

If Not Me.DesignMode Then
obj.MethodCall()
End If