1. 程式人生 > >WPF入門教程系列二十——ListView示例(二)

WPF入門教程系列二十——ListView示例(二)

數據保存 save 如何實現 component private microsoft () sender wid

第四步、WPF後臺邏輯代碼編寫

在後臺用Entity Framework 6.1的Code First方式獲取數據庫中的數據。同時,在“刷新”按鈕的方法中進行數據綁定。操作步驟如下:

1) 在“刷新”按鈕上使用鼠標右鍵,單擊,會彈出“屬性”窗口。如下圖。

技術分享

2) 在“屬性”窗口中點擊右上角的閃電圖標按鈕,會出現事件窗口。在Click事件的文本框中進行雙擊,就會把按鈕的Click事件添加到後臺代碼中。如下圖。

技術分享

3)具體代碼如下:

技術分享
public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

            Database.SetInitializer<TestDBContext>(null);

        }

 

        private void btnRefresh_Click(object sender, RoutedEventArgs e)

        {

            GetData();

        }

        TestDBContext db = new TestDBContext();

 

        protected void GetData()

        {

 

            List<S_City> list = db.S_City.ToList<S_City>();

            listView1.ItemsSource = list;

        }

        private void menuPrism_Click(object sender, RoutedEventArgs e)

        {

 

            WindowPrismDemo1 win = new WindowPrismDemo1();

            win.Show();

        }

    }
技術分享

1) 對象實體類。代碼如下。

技術分享
public class S_City

   {

        [Key]

       public long CityID{get;set;}

     public string CityName{get;set;}

     public string ZipCode{get;set;}

     public long ProvinceID{get;set;}

     public DateTime DateCreated{get;set;}

     public DateTime DateUpdated { get; set; }

    }

  public class TestDBContext : DbContext

  {

       public DbSet<S_City> S_City { get; set; }

   }
技術分享

第五步、WPF前臺界面與後臺數據的Binding

寫完了上面的代碼之後,按F5,程序運行了起來,點“刷新”按鈕卻沒有任何數據顯示。這是由於後臺數據與前面界面沒有進行“綁定”,所以無法顯示數據,接下來跟著我做。

1)給GridViewColumn指明當前列對應於數據源的哪一項,可以通過DisplayMemberBinding屬性來實現。其中Path後面的值便是上一步中所寫的類S_City中指明屬性名稱。具體代碼如下。

技術分享
<ListView Name="listView1" MinWidth="280" Grid.Row="1" >

            <ListView.View>

                <GridView x:Name="gridView1">

 

                    <GridViewColumn Header="CityID" DisplayMemberBinding="{Binding Path=CityID}"></GridViewColumn>

                    <GridViewColumn Header="CityName" DisplayMemberBinding="{Binding Path=CityName}"></GridViewColumn>

                    <GridViewColumn Header="ZipCode" DisplayMemberBinding="{Binding Path=ZipCode}"></GridViewColumn>

                    <GridViewColumn Header="ProvinceID" DisplayMemberBinding="{Binding Path=ProvinceID}"></GridViewColumn>

                    <GridViewColumn Header="DateCreated" DisplayMemberBinding="{Binding Path=DateCreated}"></GridViewColumn>

                    <GridViewColumn Header="DateUpdated" DisplayMemberBinding="{Binding Path=DateUpdated}"></GridViewColumn>

                </GridView>

            </ListView.View>

        </ListView> 
技術分享

2)在Visual Studio 2013中按F5運行WPF程序,在程序運行起來之後,鼠標左鍵點擊“刷新”按鈕。你就可以看到如下圖這樣的畫面了。

技術分享

註意:如果運行時報以下錯誤信息:

異常:已引發: "The model backing the ‘TestDBContext‘ context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269)." (System.InvalidOperationException)

引發了一個 System.InvalidOperationException: "The model backing the ‘TestDBContext‘ context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269)."

解決方法:

具體請查看我前面代碼中構造方法中以下語句。請註釋掉就會報錯,加上去就不會有問題。

Database.SetInitializer<TestDBContext>(null);


3)當我們使用鼠標左鍵點擊ListView中的記錄時,裏面的城市信息並沒有同步映射到下面的文本框中。這個功能應該如何實現呢?。

4)首先在WrapPanel元素中指明一個公共的上下文,可以通過增加屬性 DataContext="{Binding ElementName=listView1,Path=SelectedItem}來實現。

5)其次,對於需要顯示相應信息的文本框,需要通過綁定TextBox元素中的Text屬性實現,實現代碼如下:

技術分享
<WrapPanel Grid.Row="2" Orientation="Horizontal" DataContext="{Binding ElementName=listView1,Path=SelectedItem}">

            <StackPanel Orientation="Horizontal" Margin="5,2,5,2">

                <TextBlock Name="textBlock_CityID" Text="CityID:" />

                <TextBox Name="textBox_CityID" MinWidth="100" Text="{Binding CityID}" />

            </StackPanel>

            <StackPanel Orientation="Horizontal" Margin="5,2,5,2">

                <TextBlock Name="textBlock_CityName" Text="CityName:" />

                <TextBox Name="textBox_CityName" MinWidth="100" Text="{Binding CityName}" />

            </StackPanel>

            <StackPanel Orientation="Horizontal" Margin="5,2,5,2">

                <TextBlock Name="textBlock_ZipCode" Text="ZipCode:" />

                <TextBox Name="textBox_ZipCode" MinWidth="100" Text="{Binding ZipCode}" />

            </StackPanel>

            <StackPanel Orientation="Horizontal" Margin="5,2,5,2">

                <TextBlock Name="textBlock_ProvinceID" Text="ProvinceID:" />

                <TextBox Name="textBox_ProvinceID" MinWidth="100" Text="{Binding ProvinceID}"  />

            </StackPanel>

            <StackPanel Orientation="Horizontal" Margin="5,2,5,2">

                <TextBlock Name="textBlock_DateCreated" Text="DateCreated:" />

                <TextBox Name="textBox_DateCreated" MinWidth="100" Text="{Binding DateCreated}"  />

            </StackPanel>

            <StackPanel Orientation="Horizontal" Margin="5,2,5,2">

                <TextBlock Name="textBlock_DateUpdated" Text="DateUpdated:" />

                <TextBox Name="textBox_DateUpdated" MinWidth="100" Text="{Binding DateUpdated}" />

            </StackPanel>

        </WrapPanel>
技術分享

6) 在Visual Studio 2013中按F5運行WPF程序,在程序運行起來之後,鼠標左鍵點擊“刷新”按鈕。在出現數據之後,使用鼠標左鍵點擊ListView中的記錄,你會發現文本框與ListView實現了聯動。如下圖。

技術分享

第六步、數據更新

1) 在原來只放一個按鈕的地方,需要要多放一個按鈕,如果只是簡單的放一個按鈕,就會如下圖,所示,兩個按鈕重疊在一起。

技術分享

2) 我們需要在XAML窗口中加個一個面板窗口。代碼如下。

技術分享
<WrapPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Right">

        <Button  HorizontalAlignment="Right"  Name="btnRefresh" Height="22" VerticalAlignment="Top" Width="65" Click="btnRefresh_Click">刷新</Button>

        <Button  HorizontalAlignment="Right"  Name="btnUpdate" Height="22" VerticalAlignment="Top" Width="65" >更新</Button>

        </WrapPanel>
技術分享

3) 給按鈕btnUpdate添加一個Click事件,在Click事件中實現更新代碼。代碼如下。

技術分享
  private void btnUpdate_Click(object sender, RoutedEventArgs e)

        {

             long id = long.Parse(textBox_CityID.Text);

            var city = db.S_City.Where(c => c.CityID == id).OrderBy(c => c.CityID).FirstOrDefault();

            city.CityID = id;

            city.CityName = textBox_CityName.Text;

            city.DateCreated = DateTime.Parse(textBox_DateCreated.Text);

            city.DateUpdated = DateTime.Parse(textBox_DateUpdated.Text);

            city.ProvinceID = long.Parse(textBox_ProvinceID.Text);

            city.ZipCode = textBox_ZipCode.Text;       

            db.SaveChanges();    

   }
技術分享

4) 選中一條記錄,然後進行修改,更改之後,點擊“更新”按鈕。就可以把數據保存到數據庫了。如下圖。

技術分享

5) 我們查詢一下數據庫,看一下數據是否已經更新到數據庫裏面了。如下圖。

技術分享

WPF入門教程系列二十——ListView示例(二)