Mind <Your .NET> Talk

to live and let code run
See also: Other Geeks@INDC

Samples DaysEvent (Silverlight 2.0) Part 2

Membuat User Control DayEdit

Dalam membuat usercontrol DayEdit beberapa control Silberlight 2.0 yg saya gunakan antara lain :

  • DataGrid, tempat menampilkan data Event
  • DatePicker, untuk menentukan tgl event
  • Button Control, untuk melakukan aksi CRUD.

Sebagai informasi tambahan dalam  detail XAML DayEdit.Xaml juga terdiri beberapa control yg tidak kelihatan secara langsung seperti Grid, Stack Panel Control dan  Child content control dalam Datagrid termasuk DataGridTextBoxColumn sebagai control untuk definisi dalam menampilkan kolom dalam datagrid.

Dalam silverlight 2.0, jika menambahkan DataGrid Control menggunakan Drag-Drop via toolbox maka VS2008 memudahkan kita dgn menambahkan xmlns dengan alias nama my untuk memudahkan kita menambahkan control yg dibutuhkan.

xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data".

<UserControl xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    x:Class="SampleDayEvents.DayEdit"
    xmlns="http://schemas.microsoft.com/client/2007" 
    xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml 

Ketika kita ingin melakukan penambahan langsung via VS editor cukup mengetik "<my: maka akan muncul inteliisense window dengan tipe control yg diinginkan.

Using My

 

XAML  DayEdit

Untuk memudahkan memasukan data event dan melakukan CRUD, saya membuat kombinasi control sebagai panel aksi dari transaksi event, Grid sendiri dibagi oleh 2 row. Row pertama merupakan panel aksi dan row selanjutnya merupakan tempat DataGrid.

<Grid x:Name="LayoutRoot" Background="DarkGray" Grid.Row="2" Grid.Column="1"  >        
        <Grid.RowDefinitions>
            <RowDefinition MaxHeight="30"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>        
        <StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="0"  Height="100" >
        <DatePicker x:Name="dtpDay" VerticalAlignment="Top" Margin="10,8,0,0"></DatePicker>
        <TextBlock Text="New Event :" FontSize="12" VerticalAlignment="Top" Margin="8" Foreground="White"/>
        <TextBox x:Name="txtNewEvent" Width="240" Height="20" Text="" VerticalAlignment="Top" Margin="0,8" FontSize="12"/>
         <Button x:Name="btnAddNewEvent" Height="20" VerticalAlignment="Top" Margin="8,8" FontFamily="Arial" FontSize="12" Content="New" Width="48" />
         <Button x:Name="btnRemoveEvent" Height="20" VerticalAlignment="Top" Margin="0,8" FontFamily="Arial" FontSize="12" Content="Delete" Width="48" />
         <Button x:Name="btnSave" Height="20" VerticalAlignment="Top" Margin="5,8" FontFamily="Arial" FontSize="12" Content="Save" Width="48"/>                        
         </StackPanel>
        
        <my:DataGrid x:Name="dayGrid"  Grid.Column="0" Grid.Row="1" AutoGenerateColumns="False" GridlinesVisibility="All" 
          CanUserResizeColumns="True"  HeadersVisibility="All"  IsReadOnly="False" RowDetailsVisibility="Visible"  SelectionMode="SingleFullRow" RowHeight="50"  >            
            <my:DataGrid.Columns>
                <my:DataGridTextBoxColumn 
                    Header="Event Name" 
                    Width="250"
                    DisplayMemberBinding="{Binding EventName}" 
                    FontSize="20" />
                <my:DataGridTextBoxColumn 
                    Header="Desription" 
                    Width="320"
                    DisplayMemberBinding="{Binding EventDetail}" 
                    FontSize="14" />
            </my:DataGrid.Columns>
        </my:DataGrid>
        <Border BorderBrush="Black"  BorderThickness="4" CornerRadius="4,4,4,4" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Width="640" Height="480" VerticalAlignment="Stretch"  />   
    </Grid>

Dalam contoh diatas saya mendefinisikan datagrid untuk setiap column yg ingin saya tampilkan saja, pada contoh proyek ini saya tidak menginginkan EventDate ada dalam DataGrid maka yg saya lakukan adalah :

  • Set  AutoGenerationColumns -> False
  • Membuat definisi DataGrid.Columns dan Jenis column yg ingin saya gunakan, karena saya hanya ingin menampilkan data string umum, saya hanya menggunakan DataGridTextBoxColumn dan melakukan set property yg sesuai dengan keinginan saya.
    • Untuk Melakukan Set Column ke DataGridTextBoxColumn gunakan DisplayMemberBinding dengan format "{Binding NamaProperty"} , untuk proyek ini kita hanya menggunakan  2 property dari MyEvent yakni : EventName dan  EventDetail

Code Interaksi

Sewaktu pertama kali usercontrol melaksanakan load event  akan melakukan initialisasi data ke dalam MyDB object, lalu memanggil fungsi filter untuk tanggal hari ini.

private void InitializeData(DateTime valueDate)
     {
                    
         DateTime dt = valueDate;

         // Get MyEvent Collection
         listEvents = db.LoadData();

         // Filter By Selected Date
         UpdateViewGridByDate(dt);              
     }

     /// <summary>
     /// Filter List by Date
     /// </summary>
     /// <param name="value"></param>
     public void UpdateViewGridByDate(DateTime value)
     {
         var result = from e in listEvents
                      where (e.EventDate == value)
                      select e;


         MyEventList filterList = MyDB.ListToObserveCollection(result.ToList());
         BindGrid(filterList);
     }
 
Setelah itu binding ke DataGrid, perlu dicatat bahwa saya tidak melakukan binding langsung via ListEvents object yg berasal dary fungsi LoadData, karena saya ingin event yg ditampilkan berdasarkan tgl yg sedang aktif dan hal ini berlangsung jika user merubah tanggal dari DatePicker.
 
private void BindGrid(MyEventList eventList)
       {            
           // Assign to ItemSource
           try
           {
               dayGrid.ItemsSource = eventList;              
           }
           catch (Exception ex)
           {
               Debug.WriteLine(ex.ToString());
           }
           
       }
 
Ketika memilih tanggal baru via  DatePicker Control dilakukan validasi kondisi dalam event DateSelected dari DatePicker Control dan menggunakan DatePickerDateChangedEventArgs untuk mendapatkan nilai tanggal yg baru dipilih lalu update DataGrid.
 
void dtpDay_DateSelected(object sender, DatePickerDateChangedEventArgs e)
     {
         // Check if Date value is available
         if (e.AddedDate.HasValue)
         {
             UpdateViewGridByDate(e.AddedDate.Value);
         }
         else
         {
             throw new Exception("Please Select Date First");
         }
     }
 
Sewaktu insert  dengan menekan button NewEvent yg melakukan initiialisasi object baru MyEvent dan memasukan dalam koleksi event ListEvent melakukan UpdateGrid
 
void CreateNewEvent(string eventName, DateTime eventDate)
      {

          MyEvent newItm = new MyEvent { EventDate = eventDate, EventName = eventName, EventDetail = "" };

          // Add New Event
          listEvents.Add(newItm);
          // Filter It
          UpdateViewGridByDate(eventDate);       

      }
 
 
Fungsi HtmlWindow Alert & Confim
 
Di Silverlight 2.0, Class HtmlWindow ada di System.Windows.Browser.HtmlWindow namespace, jgn lupa untuk menggunakannya tidak perlu di instantiate,  karena sealed class maka cukup lakukan seperti ini,
 
System.Windows.Browser.HtmlWindow window = System.Windows.Browser.HtmlPage.Window;
 
Banyak juga fungsi bermanfaat yg dapat digunakan.
Window
 
Sewaktu menghapus data dengan menekan button Delete,  yg saya lakukan adalah mengambil nilai dari SelectedItem property dari DataGrid dan melakukan Casting ke MyEvent Object  dan memanggil fungsi RemoveEvent.  Tak lupa saya menggunakan HtmlWindow object untuk berinteraksi sewaktu menghapus dengan fungsi Confirm dan Alert.
 
void btnRemoveEvent_Click(object sender, RoutedEventArgs e)
      {
  if (dtpDay.SelectedDate.HasValue)
  {
      MyEvent itm = (MyEvent)dayGrid.SelectedItem;

      string removeConfirm = string.Format("Delete {0} ?", itm.EventName);
      if (window.Confirm(removeConfirm))
          RemoveEvent(itm);
      else
          window.Alert("You've Just cancelled Delete Item..!");
  }
  else
      window.Alert("Don't Forget Select Date!");
  
      }

void RemoveEvent(MyEvent delItem)
{            
    listEvents.Remove(delItem);
    UpdateViewGridByDate(dtpDay.SelectedDate.Value);                       
}
 
 
Update data dengan menekan button Save akan melakukan update melalui fungsi Update() dari MyDB dan  langsung menyimpan XML file.
 
void btnSave_Click(object sender, RoutedEventArgs e)
      {            
          db.Update(listEvents);
      }
 
 
Pada bagian ini saya sudah menyampaikan bagaimana :
 
  • Membuat UserControl Sederhana
  • Menggunakan Datagrid
  • Menggunakan Fungsi pada Class HtmlWindow
 
Share this post: | | | |

Comments

No Comments