Tags: , | Categories: VB.Net, Entity Framework, SQL Posted by Christoph on 5/28/2010 5:44 PM | Comments (0)
Man kann natürlich auch TSQL mit dem Entity Framework direkt benutzen. Das ganze funktioniert folgendermaßen: Dim Con As EntityClient.EntityConnection = Ctx.Connection Dim Conn = Con.StoreConnection Dim Stat = Conn.State If Not Stat = ConnectionState.Open Then Conn.Open() Using Cmd = Conn.CreateCommand Cmd.CommandText = Sql.ToString Cmd.ExecuteNonQuery() End Using If Not Stat = ConnectionState.Open Then Conn.Close()
Tags: | Categories: ASP.Net, VB.Net Posted by Christoph on 5/17/2010 2:12 PM | Comments (0)
Wenn Sonderzeichen, die z.B. aus einem Silverlight-Control kommen, noch numerische HTML Entities haben, also sowas wie “ü”, kann man das mit folgender Funktion in echte ANSI Zeichen konvertieren: Public Shared Function CleanNumericEntities(ByVal InText As String) As String Return Regex.Replace(InText, "&#\d{3};", New MatchEvaluator(AddressOf ReplaceNumericHTML)) End Function Private Shared Function ReplaceNumericHTML(ByVal Ma As Match) As String Dim Val = Ma.Value.Substring(2, 3) If IsNumeric(Val) Then Return Chr(Val) Return "?" End Function
Tags: | Categories: Silverlight, VB.Net Posted by Christoph on 1/15/2010 10:58 AM | Comments (0)
in einem Silverlight Projekt hatten wir die Notwendigkeit, eine Textbox zu benutzen, die nur die Eingabe einer Fliesskommazahl (in dem Fall eines Währungwertes) zu erlauben. Da wir nicht dringend eine externe Komponente einsetzen wolllten habe ich das Problem mit folgendem Code gelösst: Dabei wird im New-Event des Controls ein KeyDown-Event an die Textbox gebunden, der bei jesem Tastendruck überprüft, ob es ein für eine Fliesskommazahl gültiges Zeichen ist. Leider ist das “,” nicht in der Key Enumeration, und muss händisch über den KeyCode abgehandelt werden. Dabei ist zu beachten, dass das “,” in 3 Varianten abgefragt werden muss: normales “,”, Zehnertastatus und auf dem Mac gibts (wie sollte es anders sein) einen anderen Zahlencode für das “,”. und hier der Codesnippet: Public Sub New() InitializeComponent() AddHandler tbTbx.KeyDown, AddressOf OnlyNumbers End Sub Public Sub OnlyNumbers(ByVal sender As Object, ByVal e As KeyEventArgs) Select Case e.Key Case Key.Tab Return Case Key.D0 Case Key.D1 Case Key.D2 Case Key.D3 Case Key.D4 Case Key.D5 Case Key.D6 Case Key.D7 Case Key.D8 Case Key.D9 Case Key.NumPad0 Case Key.NumPad1 Case Key.NumPad2 Case Key.NumPad3 Case Key.NumPad4 Case Key.NumPad5 Case Key.NumPad6 Case Key.NumPad7 Case Key.NumPad8 Case Key.NumPad9 Case Key.Decimal ' , Case Else Select Case e.PlatformKeyCode Case 188, 110, 43 ' ",", ", Numpad" , ", Mac" If tbTbx.Text.IndexOf(",") > -1 Then e.Handled = True Return End If Case Else e.Handled = True Return End Select End Select End Sub
Tags: , , | Categories: ASP.Net, VB.Net Posted by Christoph on 10/16/2009 2:28 PM | Comments (0)
Für die Benutzung von SEO freundlichen URLs (Search Engine Optimisation) benutze ich das URL Rewriting Modul des IIS (-> http://www.iis.net/extensions/URLRewrite). Wenn nun ein Datapager z.B. an ein Listview Control gebunden wird, benutzt dieser leider als Linkadresse nicht die “schöne” URL, sondern die aus dem Rewriting entstehende URL. Man kann dem Datapager aber mit dieser Funktion die neuen (schönen) Links beibringen: Private Sub FixPagerURLs(ByVal Pager As DataPager) For Each Pag As DataPagerFieldItem In Pager.Controls For Each Ctrl In Pag.Controls If TypeOf Ctrl Is HyperLink Then Dim Hyp As HyperLink = Ctrl Dim Req = Hyp.NavigateUrl.Replace(Request.Path, "").Replace("?", "") Dim Params = Req.Split("&") Dim NewPage = (From item In Params Where item.StartsWith("page")).FirstOrDefault Dim URL = Request.RawUrl If URL.Contains("?") Then URL = URL.Substring(0, URL.IndexOf("?")) If NewPage = "page=1" Then Hyp.NavigateUrl = URL Else Hyp.NavigateUrl = String.Concat(URL, "?", NewPage) End If End If Next Next End Sub und den dann im DataBound Event des Listview aufrufen: FixPagerURLs(dpProducts) Die Idee dazu habe ich von dieser Webseite: http://blog.anasghanem.com/post/Programmatically-Modifying-the-HyperLinks-in-the-DataPager-control.aspx
Tags: | Categories: VB.Net Posted by Christoph on 5/22/2009 5:18 PM | Comments (0)
Wenn man eine List(of Integer) in ein String umwandeln möchte, benötigt man zuerst einen Helper, der die Formatierung eines einzelnen Items vornimmt: Private Shared Function I2S(ByVal Nummer As Integer) As String Return Nummer.ToString End Function und diesen kann man dann benutzen, um eine komplette Liste in das gewünschte Zielformat zu konvertieren: Dim Arr1 as New List(of Integer) Dim Arr2 As List(Of String) = Arr1.ConvertAll(New Converter(Of Integer, String)(AddressOf I2S)) Return String.Join(", ", Arr2.ToArray)
Tags: | Categories: ASP.Net, VB.Net Posted by Christoph on 4/7/2009 12:14 PM | Comments (0)
Wenn man Daten über eine Webseite zu Excel exportieren will, geht das eigentlich ganz einfach, indem man eine HTML Seite ausgibt, die eine Tabelle enthält, und dann den Contentyp setzt. Dazu kann man noch den Tabellenzellen bestimmte CSS Attribute mitgeben, so dass die dann von Excel auch passent erkannt werden. Hier mal ein ganz grober Dummy, der aber das Vorgehen veranschaulicht: Response.Clear()Response.ClearHeaders()Response.ContentEncoding = Encoding.DefaultResponse.Buffer = TrueResponse.ContentType = "application/vnd.ms-excel"Response.AddHeader("Content-Disposition", "inline; filename=Statistik.xls")Dim Out As New StringBuilderOut.Append("<html>")Out.Append("<style>")Out.Append("body,th,td{font-size:10px;font-family:arial;color:black;}")Out.Append("table{mso-displayed-decimal-separator:""\,"";mso-displayed-thousand-separator:""\."";}")Out.Append("td{padding-top:1px;padding-right:1px;padding-left:1px;mso-ignore:padding;color:black;font-size:10.0pt;font-weight:400;font-style:normal;text-decoration:none;font-family:Calibri,sans-serif;mso-font-charset:0;mso-number-format:General;text-align:left;vertical-align:top;mso-background-source:auto;mso-pattern:auto;white-space:normal;}")Out.Append(".th{background:#d8d8d8;font-size:10px;font-family:arial;color:black;mso-pattern:black none;}")Out.Append(".date{mso-number-format:""Short Date"";}")Out.Append("</style>")Out.Append("<body>")Out.Append("<table>")Out.Append("<tr>")Out.Append("<td class='.date' align='left'>7.4.2009</th>")Out.Append("</tr>")Out.Append("</table>")Out.Append("</body>")Out.Append("</html>")Response.Write(Out.ToString)Response.End() Folgende Formatierungsmöglichkeiten hat man für mso-number-format: "0" NO Decimals "0\.000" 3 Decimals "\#\,\#\#0\.000" Comma with 3 dec "mm\/dd\/yy" Date7 "mmmm\ d\,\ yyyy" Date9 "m\/d\/yy\ h\:mm\ AM\/PM" D -T AMPM "Short Date" 01/03/1998 "Medium Date" 01-mar-98 "d\-mmm\-yyyy" 01-mar-1998 "Short Time" 5:16 "Medium Time" 5:16 am "Long Time" 5:16:21:00 "Percent" Percent - two decimals "0%" Percent - no decimals "0\.E+00" Scientific Notation "\@" Text "\#\ ???\/???" Fractions - up to 3 digits (312/943) "\0022£\0022\#\,\#\#0\.00" £12.76 "\#\,\#\#0\.00_ \;\[Red\]\-\#\,\#\#0\.00\ " 2 decimals, negative numbers in red and signed (1.56 -1.56)
Tags: , | Categories: LINQ, VB.Net, XML Posted by Christoph on 3/17/2009 10:47 AM | Comments (0)
Ich hatte das Problem, zu einem bestehenden XML noch weitere Elemente hinzufügen zu müssen. Das XML war als String im System vorhanden, und da hab ich das ganze per LINQ gelösst: Als erstes muss folgender Namespace als Referenz im Projekt eingebunden, und in der entsprechenden Klasse importiert sein: Imports System.Xml.Linq und dann funktioniert das ganze recht einfach so: Dim Doc As XDocument = XDocument.Parse(XmlString)Dim Root As XElement = Doc.Element("root")Dim xNewElement As New XElement("newnode")xNewElement.Value = MyValuexNewElement.SetAttributeValue("id", MyID)Root.AddxNewElementReturn Doc.ToString
Tags: , , | Categories: Entity Framework, VB.Net, Visual Stutio Posted by Christoph on 2/2/2009 7:12 PM | Comments (0)
Entity Framework und SQL Server 2005 mit 2008 im Mischbetrieb [More]
Tags: , | Categories: Entity Framework, LINQ, VB.Net Posted by Christoph on 1/15/2009 11:34 AM | Comments (0)
In einem Projekt benutze ich das Microsoft Entity Framework um Daten aus der Datenbank an ein Gridview zu binden. Nun will ich aber zeilenweise bestimmte Zellen ausblenden, wenn das Datenobjekt z.B. bestimmte Arten von Eigenschaften/Kindern hat. Um im RowDataBound Handler des Gridview aber das jewilige Entity zu bekommen, benötigt man eine kleine Hilfsfunktion:   Public Function GetRowItem(Of TEntity As Class)(ByVal dataItem As Object) As TEntity Dim Entity = TryCast(dataItem, TEntity) If Entity IsNot Nothing Then Return Entity Dim td = TryCast(dataItem, ComponentModel.ICustomTypeDescriptor) If td IsNot Nothing Then Return DirectCast(td.GetPropertyOwner(Nothing), TEntity) Return NothingEnd Function Danach kann man dann in der RowDataBound folgenden Code benutzen, um die Entität (in meinem Fall fom Typ "Attribute”) zu bekommen:   Private Sub gvAttribs_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvAttribs.RowDataBound If e.Row.RowType = DataControlRowType.DataRow Then Dim Attrib = GetRowItem(Of Attribute)(e.Row.DataItem) '-- Und hier gehts dann weiter ... End IfEnd Sub   Ich habe diesen Hinweis im MSDN Social gefunden.
Categories: VB.Net Posted by Christoph on 12/3/2008 1:21 PM | Comments (1)
Wenn die im Filesystem liegenden Dateien nach dem Änderungsdatum sortiert ausgegeben werden sollen, muss man sich zuerst einen kleinen Helper schreiben, der die Sortierung übernimmt: Public Class Sorter Implements IComparer Public Function CompareDesc(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare Dim F1 As FileInfo = DirectCast(x, FileInfo) Dim F2 As FileInfo = DirectCast(y, FileInfo) CompareDesc = DateTime.Compare(F1.LastWriteTime, F2.LastWriteTime) End Function End Class dann kann man die Files folgendermassen sortieren und z.B. in einer Dropdown Liste ausgeben: Dim Dir As New DirectoryInfo("d:\import") Dim Files() As FileInfo = Dir.GetFiles("*.jpg") Array.Sort(Files, New Sorter) ddlFiles.Items.Clear() For Each FI As FileInfo In Files ddlFiles.Items.Add(New ListItem(String.Format("{0:dd}.{0:MM}.{0:yy} {0:HH}:{0:mm} - {1}", FI.LastWriteTime, FI.Name), FI.FullName)) Next Diesen Hinweis habe ich hier gefunden.