This is a migrated thread and some comments may be shown as answers.

File Browser Dialog as Custom DataFormDataField

1 Answer 163 Views
DataForm
This is a migrated thread and some comments may be shown as answers.
BILL
Top achievements
Rank 1
BILL asked on 01 May 2013, 06:42 PM
Hello All,
   I just wanted to submit a solution I found that allows me to attach a file browser dialog to a textbox field of a data form (see attached example1.png).   Basically I wanted a browse button next to the text box that would open a filedialog and replace the textbox's text property with the selected file's path.   I found this cool class in a blog post ( blogpost )  that allow someone to attach a filebrowser dialog to a textbox and re-engineered it in VB.NET (see the blog posting for the C# version).  I then created a User Control that contains the button and textbox and attaches to a custom filter field.  Next I created a class call DataFormImageFileBrowser that Inherits from the DataFormDataField and replaces the textbox with the user control.  Finally I bound the custom DataFormDataField in the AutoGeneratingField event and viola it works... here my code for the OpenFileDialogEx and the DataFormImageFileBrowser

Imports System
Imports Microsoft.Win32
Imports Telerik.Windows
Imports Telerik.Windows.Controls
 
Public Class OpenFileDialogEx
    Public Shared ReadOnly FilterProperty As DependencyProperty = DependencyProperty.RegisterAttached("Filter", GetType(String), GetType(OpenFileDialogEx), New PropertyMetadata("All documents (.*)|*.*", Sub(d, e) AttachFileDialog(DirectCast(d, TextBox), e)))
    Public Shared Function GetFilter(element As UIElement) As String
        Return DirectCast(element.GetValue(FilterProperty), String)
    End Function
 
    Public Shared Sub SetFilter(element As UIElement, value As String)
        element.SetValue(FilterProperty, value)
    End Sub
 
 
    Private Shared Sub AttachFileDialog(textBox As TextBox, args As DependencyPropertyChangedEventArgs)
        Dim parent = DirectCast(textBox.Parent, Panel)
        ''added this because there was a problem with double binding and it was causing the filebrowser dialog to pop up twice
        Dim tag = TryCast(parent.Tag, String)
        If Not IsNothing(tag) Then Return
        parent.Tag = "already bound"
        AddHandler parent.Loaded, Sub()
 
                                      Dim button = DirectCast(parent.Children.Cast(Of Object)().FirstOrDefault(Function(x) TypeOf x Is Button), Button)
                                      Dim filter = DirectCast(args.NewValue, String)
                                      AddHandler button.Click, Sub(s, e)
                                                                   Dim dlg = New OpenFileDialog()
                                                                   dlg.Filter = filter
                                                                   Dim result = dlg.ShowDialog()
                                                                   If result = True Then
                                                                       textBox.Text = dlg.FileName
                                                                   End If
                                                               End Sub
                                  End Sub
    End Sub
End Class
 
Public Class DataFormImageFileBrowser
    Inherits DataFormDataField
 
    Protected Overrides Function GetControlBindingProperty() As DependencyProperty
        Return TextBox.TextProperty
    End Function
 
    Protected Overrides Function GetControl() As Control
        Dim fd = New OpenFileDialogUC("Image file (pdf,png,gif,jpg,bmp,tif,emf,wmf)|*.pdf;*.png;*.gif;*.jpg;*.bmp;*.jpeg;*.tiff;*.tif;*.emf;*.wmf")
 
        Dim dependencyProperty As DependencyProperty = GetControlBindingProperty()
        If Not IsNothing(DataMemberBinding) Then
            Dim binding = DataMemberBinding
            fd.FileNameTbx.SetBinding(dependencyProperty, binding)
        End If
 
        Return fd
    End Function
End Class


Here is the code for the UserControl:
<UserControl x:Class="OpenFileDialogUC"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:src="clr-namespace:CarWashInventoryManagement"
             mc:Ignorable="d" >
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <TextBox x:Name="FileNameTbx" MinWidth="100" src:OpenFileDialogEx.Filter="{Binding FilterStr}" Grid.Column="0" />
        <Button Grid.Column="1">Browse</Button>
    </Grid>
</UserControl>

and its code behind:
Public Class OpenFileDialogUC
    Public Property FilterStr As String = String.Empty
    Public Sub New(_filter As String)
        FilterStr = _filter
        DataContext = Me
        InitializeComponent()
    End Sub
End Class


here is the code for the AutoGeneratingField for the RadDataForm
ElseIf e.PropertyName = "FileName" Then
        Dim df = New DataFormImageFileBrowser()
        df.Label = e.DataField.Label
        df.DataMemberBinding = e.DataField.DataMemberBinding
        e.DataField = df
        e.DataField.Label = "File Name"

I thought this was pretty cool so I thought I would share...

1 Answer, 1 is accepted

Sort by
0
Maya
Telerik team
answered on 01 May 2013, 11:04 PM
Hi Bill,

Thanks a lot for sharing with the community. It might be really helpful for someone dealing with the same issue.
I reward you with telerik points 

Kind regards,
Maya
the Telerik team

Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

Tags
DataForm
Asked by
BILL
Top achievements
Rank 1
Answers by
Maya
Telerik team
Share this question
or