אתה יכול להגיע לאותם תוצאות כי כל האוביקטים חשופים לשימושך אבל זה שונה בתחביר ובצורת גישה לאובייקטים עיין כאן:
http://msdn.microsoft.com/en-us/library/office/ff865816.aspx
פורסם במקור בפורום CODE613 ב02/11/2013 20:18 (+02:00)
אתה יכול להגיע לאותם תוצאות כי כל האוביקטים חשופים לשימושך אבל זה שונה בתחביר ובצורת גישה לאובייקטים עיין כאן:
http://msdn.microsoft.com/en-us/library/office/ff865816.aspx
פורסם במקור בפורום CODE613 ב02/11/2013 20:18 (+02:00)
יש בויזואל סטודיו תבנית פרוייקט שנקרא OutlookAddIn1 זה נמצא בקטגוריה אופיס גם ב VB וגם ב C#
שם אתה בונה סרגל ו/או חלונית משימות שתופיע בתוך האאוטלוק שם יחספו בפניך כל האוביקטים והפונקציות שמפעילות את אאוטלוק. יש לזה המון דוגמאות כבר בתוך העזרה של ויזואל סטודיו.
פורסם במקור בפורום CODE613 ב30/10/2013 21:56 (+02:00)
אני מאוד מתנצל על אי ההבנה שקרתה פה
בכל מקרה עזרת לי מאוד!
פורסם במקור בפורום CODE613 ב12/11/2013 19:35 (+02:00)
עדיין בלחיצה על הכפתור בורר התאריכים לא נסגר.
דבר נוסף אני בעצם רוצה שאני אשתמש בסטול הזה של בורר תאריכים בדטה-גריד שיש בו עמודה של תאריך וכמו באקסס שכאשר שדה של תאריך בפוקוס יש למשתמש אפשרות ללחוץ על סמל של לוח שנה ואז הלוח שנה נפתח הוא לוחץ על 'היום' ולוח השנה נסגר, דבר כל כך פשוט לכאורא וכל כך קשה לעשות אותו בדוט-נט....
משהו בצירוף זה:
<DataGridTemplateColumn Header="Pick a Date">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding myDate}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<!--שהבורר יהיה עם לחצן 'היום'-->
<DatePicker SelectedDate="{Binding myDate}" />
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
פורסם במקור בפורום CODE613 ב12/11/2013 15:27 (+02:00)
עד כמה שהבנתי, ואני מקווה שאני טועה, שכל הTemplate זה לא משהו שקיים בזכרון כמו משתנה מוצהר עם NEW, אלא זה משהו ריק כמו איזה טיפוס כל שהו, ולכן כדי לחבר לזה פקודה צריך לעשות שמיניות באויר עם ICommand, למשל אם אני רוצה להכניס לחצן לתוך פקד של בורר תאריכים כדי שהפקד יעבור ל'היום':
[code2=vb.net:2enqd55o]Imports System.Windows.Input
Imports System.Windows.Controls
Public NotInheritable Class CalendarCommands
Private Sub New()
End Sub
Private Shared ReadOnly _selectTodayCommand As New SelectTodayCommand()
Public Shared ReadOnly Property SelectToday() As ICommand
Get
Return _selectTodayCommand
End Get
End Property
Private NotInheritable Class SelectTodayCommand
Implements ICommand
Public Custom Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged
AddHandler(ByVal value As EventHandler)
'CommandManager.AddCanExecuteHandler(value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
'CommandManager.RequerySuggested(value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
End RaiseEvent
End Event
Public Function CanExecute(parameter As Object) _
As Boolean Implements ICommand.CanExecute
Return TypeOf parameter Is Calendar
End Function
Public Sub Execute(parameter As Object) Implements ICommand.Execute
Dim calendar = TryCast(parameter, Calendar)
If calendar IsNot Nothing Then
Dim today = DateTime.Today
calendar.SelectedDate = today
calendar.DisplayDate = today
'מה להוסיף כאן כדי שבורר התאריכים יסגר????
End If
End Sub
End Class
End Class[/code2:2enqd55o]
<Style x:Key="DefaultCalendar" TargetType="Calendar" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Calendar}">
<StackPanel HorizontalAlignment="Center" Name="PART_Root">
<CalendarItem Background="{TemplateBinding Control.Background}"
BorderBrush="{TemplateBinding Control.BorderBrush}"
BorderThickness="{TemplateBinding Control.BorderThickness}"
Name="PART_CalendarItem"
Style="{TemplateBinding Calendar.CalendarItemStyle}" />
<Button Content="Today" Command="{x:Static Commands:CalendarCommands.SelectToday}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
כמה זה יכל להיות פשוט אם הלחצן שבתוך ההTemplate היה משהו קיים שאפשר להתיחס אליו בקוד ולכתוב לו פונקציה מטפלת.
אולי מישהו יחכים אותנו בכל הנושא הזה?
פורסם במקור בפורום CODE613 ב30/10/2013 18:37 (+02:00)
יש כאן אשכול ארוך איך לקרוא את ה MFT של הדיסק ולקבל בשניות רשימה של אלפי קבצים ותקיות שקימים בכונן.
וכאן יש פרוייקט מוכן שמוציא קובץ עם רשימת כל שמות הקבצים והתקיות.
אך אליה וקוץ בה, המון קבצים שברשימה שמתקבלת מה MFT לא קיימים בפועל במחשב, אולי פעם היו ונמחקו או אולי יש סיבה אחרת שהם מופיעים ברשימה איני יודע בדיוק.
ואם נעבור על כל הרשימה ונברור אחד אחד עם IO.File.Exists הרי שזה יקח המון זמן.
השאלות שלי הם 2:
תודה לכולם.
פורסם במקור בפורום CODE613 ב18/10/2013 08:06 (+03:00)
זה ממש נפלא כעת! האיקונים מוסיפים המון.
רק הבעיה שהם לא חדים אע''פ שהם מוצגים ברזולוציה המקורית שלהם, אותו דבר ב WINFORMS היא נראה יותר חד, יש מה לעשות עם זה?
פורסם במקור בפורום CODE613 ב17/10/2013 21:00 (+03:00)
יפה מאוד, תודה רבה יישר כח!
@דוד ל.ט.
מעניין אותי איך הצלחת להכניס ערכים טקסטואליים בכל העמודות (שם, גודל וכו') ?
מה שעושים ב XAML עשיתי בקוד של הבנאי:
אתה נותן שם לכל עמודה בליסט-ויו
שם_עמודה.DisplayMemberBinding = New Binding("שם_המאפיין")
פורסם במקור בפורום CODE613 ב17/10/2013 20:34 (+03:00)
אני משתמש בקוד הבא כדי לקבל איקונים:
Imports System.Runtime.InteropServices
Public Class SYS_ICO
Public Shared ICO_DIC As New Dictionary(Of String, Icon)
'This function get the icon for the specified file path extension
Public Shared Function GetIcon(ByVal filePath As String) As System.Drawing.Icon
Try
Dim ico As System.Drawing.Icon
'Get the extension
Dim ext As String = IO.Path.GetExtension(filePath)
' בודק אם האיקון כבר קיים
ICO_DIC.TryGetValue(ext, ico)
If ico IsNot Nothing Then
Return ico
End If
Dim shellFileInfo As New SYS_ICO.SHFILEINFO()
SYS_ICO.SHGetFileInfo(ext, 128, shellFileInfo, _
Convert.ToUInt32(Marshal.SizeOf(shellFileInfo)), _
Convert.ToUInt32(256I Or 1I Or 16I))
ico = System.Drawing.Icon.FromHandle(shellFileInfo.hIcon)
ICO_DIC.Add(ext, ico)
Return ico
Catch ex As Exception
Return My.Resources.איקון
End Try
End Function
<StructLayout(LayoutKind.Sequential)> _
Private Structure SHFILEINFO
Public hIcon As IntPtr
Public iIcon As Integer
Public dwAttributes As System.UInt32
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
Public szDisplayName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
Public szTypeName As String
End Structure
<DllImport("Shell32.dll", ENTRYPOINT:="SHGetFileInfo")> _
Private Shared Function SHGetFileInfo(
ByVal pszPath As String,
ByVal dwFileAttributes As System.UInt32,
ByRef psfi As SHFILEINFO,
ByVal cbFileInfo As System.UInt32,
ByVal uFlags As System.UInt32) As IntPtr
End Function
End Class
פורסם במקור בפורום CODE613 ב17/10/2013 17:55 (+03:00)
תודה רבה,
כל זה הבנתי, אבל איפה האייקון?
בקוד שלך הבאת:
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding icon}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
ואני עשיתי בקוד שלי אותו דבר:
<GridViewColumn Header="ico" Width="30" DisplayMemberBinding="{Binding ICON}" CellTemplate="{Binding ICON}" />
אבל האיקון לא מופיע כי לא שמנו כלום ב Public Property Image As ImageSource
בקיצור איך אני מגדיר את המאפיין הזה בזמן ריצה ?
ושוב תודה רבה.
פורסם במקור בפורום CODE613 ב17/10/2013 14:45 (+03:00)
החלון שאני עוסק בו כעת אמור להציג תוכן תיקיה נבחרת, התוכן כולל קבצים ותקיות משנה, ואני רוצה להציג אותו ב ListView,
עמודה הראשונה ב ListView תהיה האיקון של הקובץ או התקיה כפי שהוא מוגדר בריגיסטרי [ולזה יש לי קוד שמחלץ את האייקונים] ובשאר העמודות ב ListView אני מציג טקסט כמו שם הקובץ תאריך שינוי וכדומה.
התיקיה שאותה אני רוצה להראות בתוך ה ListView משתנת כל פעם ע''י משתמש ולכן גם האיקונים צריכים להשתנות בהתאם.
תודה רבה.
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="765">
<Grid>
<ListView Margin="12,41,12,12" ItemsSource="{Binding}"
GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler"
SelectionMode="Multiple" Foreground="Black">
<ListView.View>
<GridView>
<GridViewColumn Header="ico" Width="30" DisplayMemberBinding="{Binding ICON}" CellTemplate="{Binding ICON}" />
<GridViewColumn Header="שם" Width="200" />
<GridViewColumn Header="תיקיה מכילה" Width="200" />
<GridViewColumn Header="סוג" Width="70" />
<GridViewColumn Header="תאריך שינוי" Width="200" />
<GridViewColumn Header="גודל" Width="100" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
פורסם במקור בפורום CODE613 ב17/10/2013 11:05 (+03:00)
השאלה שלי איך משנים בזמן ריצה את התמונה המופיעה בכל שורה ב ListView ?
פורסם במקור בפורום CODE613 ב17/10/2013 08:31 (+03:00)
יש לי איזו פונקציה שמצאתי שמגלה קידוד של קובץ אבל זה לא פיתרון מושלם, האם יש למישהו נסיון עם זה ויוכל להוסיף?
תודה.
Public Shared Function GetEncoding(ByVal filename As String) As Encoding
' Read the BOM
Dim bom(3) As Byte
Dim FS As New FileStream(filename, FileMode.Open)
FS.Read(bom, 0, 4)
FS.Close()
' Analyze the BOM
If bom(0) = 43 AndAlso bom(1) = 47 AndAlso bom(2) = 118 Then
Return Encoding.UTF7
End If
If bom(0) = 239 AndAlso bom(1) = 187 AndAlso bom(2) = 191 Then
Return Encoding.UTF8
End If
If bom(0) = 255 AndAlso bom(1) = 254 Then
Return Encoding.Unicode
End If
'UTF-16LE
If bom(0) = 254 AndAlso bom(1) = 255 Then
Return Encoding.BigEndianUnicode
End If
'UTF-16BE
If bom(0) = 0 AndAlso bom(1) = 0 AndAlso bom(2) = 254 AndAlso bom(3) = 255 Then
Return Encoding.UTF32
End If
Dim UTF8 As String = File.ReadAllText(filename, Encoding.UTF8)
If UTF8.Contains(ChrW(-3) & ChrW(-3) & ChrW(-3)) = True Then
Return Encoding.Default
End If
Dim ASCII As String = File.ReadAllText(filename, Encoding.ASCII)
If ASCII.Contains("????") = True Then
Return Encoding.UTF8
End If
Return Encoding.Default
End Function
פורסם במקור בפורום CODE613 ב12/10/2013 21:30 (+03:00)
נכון, אבל זה לא ממש אותו עבודה בכל המקרים כי לפעמים יותר מהר לקרוא את כל שמות הקבצים עם הפונקציה המהירה ולסנן רק מה שאני צריך מאשר ללכת עם הפונקציות Directory.GetDirectories או Directory.GetFiles ולפעמים זה להיפך, השאלה אם יש איזו עצה מבריקה איך אני אדע מראש באיזו דרך לילך? [או אולי להפעיל את שניהם ומי שיגמור ראשון לקחת אותו, ולהפסיק את השני....?]
פורסם במקור בפורום CODE613 ב12/10/2013 21:28 (+03:00)
מצאתי פרוייקט ממש מוצלח, שבו תוך 3-4 שניות מקבלים רשימה של כל הקבצים והתקיות שיש בכונן C מה שע''י פונקציות רגילות של Directory.GetDirectories או Directory.GetFiles יכול לקחת כמה דקות ארוכות.
אבל הבעיה היא שהוא תמיד סורק את כל הכונן, וזה לא מתאים כאשר הכונן גדול ואני צריך לסרוק רק איזו תקיה קטנה.
השאלה יש למישהו הצעה איך ליעל את הדברים האלו למקסימום? אולי למישהו יש רעיון לשפץ את הפונקציה המהירה שלא תסרוק את הכל אלא רק את מה שצריך?
תודה לכולם ושבת שלום.
Public Sub FindAllFiles(ByVal szDriveLetter As String,
fFileFound As FileFound_Delegate,
fProgress As Progress_Delegate,
fMatch As IsMatch_Delegate)
Dim usnRecord As USN_RECORD
Dim mft As MFT_ENUM_DATA
Dim dwRetBytes As Integer
Dim cb As Integer
Dim dicFRNLookup As New Dictionary(Of Long, FSNode)
Dim bIsFile As Boolean
' This shouldn't be called more than once.
If m_Buffer.ToInt32 <> 0 Then
Console.WriteLine("invalid buffer")
Exit Sub
End If
' progress
If Not IsNothing(fProgress) Then fProgress.Invoke("Building file list.")
' Assign buffer size
m_BufferSize = 65536 '64KB
' Allocate a buffer to use for reading records.
m_Buffer = Marshal.AllocHGlobal(m_BufferSize)
' correct path
szDriveLetter = szDriveLetter.TrimEnd("\"c)
' Open the volume handle
m_hCJ = OpenVolume(szDriveLetter)
' Check if the volume handle is valid.
If m_hCJ = INVALID_HANDLE_VALUE Then
Console.WriteLine("Couldn't open handle to the volume.")
Cleanup()
Exit Sub
End If
mft.StartFileReferenceNumber = 0
mft.LowUsn = 0
mft.HighUsn = Long.MaxValue
Do
If DeviceIoControl(m_hCJ, FSCTL_ENUM_USN_DATA, mft, Marshal.SizeOf(mft), m_Buffer, m_BufferSize, dwRetBytes, IntPtr.Zero) Then
cb = dwRetBytes
' Pointer to the first record
Dim pUsnRecord As New IntPtr(m_Buffer.ToInt32() + 8)
While (dwRetBytes > 8)
' Copy pointer to USN_RECORD structure.
usnRecord = Marshal.PtrToStructure(pUsnRecord, usnRecord.GetType)
' The filename within the USN_RECORD.
Dim FileName As String = Marshal.PtrToStringUni(New IntPtr(pUsnRecord.ToInt32() + usnRecord.FileNameOffset), usnRecord.FileNameLength / 2)
'If Not FileName.StartsWith("$") Then
' use a delegate to determine if this file even matches our criteria
Dim bIsMatch As Boolean = True
If Not IsNothing(fMatch) Then fMatch.Invoke(FileName, usnRecord.FileAttributes, bIsMatch)
If bIsMatch Then
bIsFile = Not usnRecord.FileAttributes.HasFlag(FileAttribute.Directory)
dicFRNLookup.Add(usnRecord.FileReferenceNumber, New FSNode(usnRecord.FileReferenceNumber, usnRecord.ParentFileReferenceNumber, FileName, bIsFile))
End If
'End If
' Pointer to the next record in the buffer.
pUsnRecord = New IntPtr(pUsnRecord.ToInt32() + usnRecord.RecordLength)
dwRetBytes -= usnRecord.RecordLength
End While
' The first 8 bytes is always the start of the next USN.
mft.StartFileReferenceNumber = Marshal.ReadInt64(m_Buffer, 0)
Else
Exit Do
End If
Loop Until cb <= 8
If Not IsNothing(fProgress) Then fProgress.Invoke("Parsing file names.")
' Resolve all paths for Files
For Each oFSNode As FSNode In dicFRNLookup.Values.Where(Function(o) o.IsFile)
Dim sFullPath As String = oFSNode.FileName
Dim oParentFSNode As FSNode = oFSNode
While dicFRNLookup.TryGetValue(oParentFSNode.ParentFRN, oParentFSNode)
sFullPath = String.Concat(oParentFSNode.FileName, "\", sFullPath)
End While
sFullPath = String.Concat(szDriveLetter, "\", sFullPath)
If Not IsNothing(fFileFound) Then fFileFound.Invoke(sFullPath, 0)
Next
'// cleanup
Cleanup()
If Not IsNothing(fProgress) Then fProgress.Invoke("Complete.")
End Sub
פורסם במקור בפורום CODE613 ב11/10/2013 10:51 (+03:00)
יישר כח גדול להנהלה על תיקון קבלת העדכונים!!
פורסם במקור בפורום CODE613 ב20/01/2014 15:07 (+02:00)
אני נרשם אבל לא מקבל מייל, זה רק אצלי?
פורסם במקור בפורום CODE613 ב10/10/2013 20:27 (+03:00)
תודה , גם אני אוהב יותר את VB.NET ו VBA אבל לא יפריע לי להיות באופנה...
פורסם במקור בפורום CODE613 ב09/10/2013 22:02 (+03:00)
אולי תעלה כאן איזו דוגמא קלאסית של תוכנה לניהול מכירות כמו Northwind שיש באקסס רק שתהיה עם C#+WPF ?
תודה.
פורסם במקור בפורום CODE613 ב09/10/2013 12:40 (+03:00)
ומה הן האלטרנטיבות שאתה מציע?
פורסם במקור בפורום CODE613 ב09/10/2013 08:15 (+03:00)