레이블이 데이터바인딩인 게시물을 표시합니다. 모든 게시물 표시
레이블이 데이터바인딩인 게시물을 표시합니다. 모든 게시물 표시

2021년 12월 18일 토요일

(WPF동영상, WPF교육, WPF학원교육, WPF학원)데이터 바인딩(Data Binding) 이란?

 











(WPF동영상)데이터 바인딩(Data Binding) 이란?

  • 데이터 바인딩이란 “컨트롤 or 엘리먼트를 데이터에 연결시키는 기술”이다. 
  • 예문

//소스객체

<TextBox Name="txt1" Text="{Binding Mode=OneWay}" />


//타겟객체

<TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text}"/>

  • 데이터 바인딩은 소스와 타겟이 필요하며 일반적으로 소스는 데이터(ViewModel)이고 타겟은 컨트롤 입니다. 하지만 어느 경우엔 소스와 타겟 둘다 컨트롤이 될수가 있어 구분이 모호할 때도 있습니다. 또 어떤 경우에는 반대로 타겟이 소스에게 데이터를 전달하기도 합니다.
  • 모든 바인딩에는 소스 객체, 소스 속성, 타겟 객체 및 타겟 속성이 있습니다.
  • 타겟 객체는 바인딩 할 속성, 즉 데이터를 렌더링하는 UI 컨트롤을 소유하는 객체이며 소스 객체는 Binding Source속성 또는 ViewModel 클래스인 경우 DataContext 속성으로 지정하면 됩니다.
  • Binding.Source 속성을 통해 지정되는 원본 개체없이 정의 된 바인딩은 대상 개체의 DataContext를 원본으로 사용한다. 
  • DataContext 값은 한 컨트롤에서 다른 컨트롤로 비주얼 트리 아래로 상속되는데, 하위 객체에서 사용가능 합니다.
  • 데이터 바인딩은 이벤트 핸들러를 대체할 수 있는데 이는 C#코드를 줄이는 역할을 합니다. XAML에서 정의된 데이터 바인딩은 C# 코드 비하인드 파일에서 이벤트 핸들러를 정의할 필요가 없으며 코드 비하인드 파일 자체가 필요 없는 경우도 있습니다.
  • 컨트롤은 데이터를 사용자에게 보여주는 것과 사용자가 데이터를 변경할 수 있게 해주는 두 가지 기능을 제공합니다. 최근 컨트롤과 데이터 사이의 많은 반복 작업들이 단순화 되면서 CheckBox를 Boolean 변수로 바인딩하고 사용자가 작업이 끝난 후 Boolean 변수를 다시 CheckBox 값으로 바인딩하는 코드들을 만들어야 했는데 아래처럼 CheckBox와 Bool 변수 사이를 데이터바인딩을 이용하게 간단하게 처리할 수 있습니다.
  • 예문.

[MainWindow.xaml]

<StackPanel Orientation="Vertical" Margin="20" >

        <Label Content="Which city do you love?"/>

        <CheckBox Content="SEOUL" IsChecked="{Binding Seoul}"/>

        <CheckBox Content="JEJOO" IsChecked="{Binding Jejoo}"/>

        <CheckBox Content="INCHEON" IsChecked="{Binding Incheon}"/>

        <Button Content="제출" Click="Sumit_Click"/>

</StackPanel>


[MainWindow.xaml.cs]

public partial class MainWindow : Window

{

//UI 컨트롤에서 바인딩으로 사용할 소스 속성들

public bool Seoul { get; set; }

public bool Jejoo { get; set; }

public bool Incheon { get; set; }


public MainWindow()

{

      this.InitializeComponent();

      //바인딩의 소스객체, UI컨트롤에서 별도의 소스 지정없이 사용가능

      //Window의 하위객체에서 소스 속성으로 사용가능

      this.DataContext = this; 

}


//버튼의 클릭 이벤트 핸들러

private void Sumit_Click(object sender, RoutedEventArgs e)

{

      MessageBox.Show(string.Format("SEOUL: {0}, JEJOO: {1}, INCHEON: {2}", Seoul, Jejoo, Incheon));

}


}




  • 다음은 TextBox간의 단방향 데이터 바인딩 예문을 살펴보자.
  • 아래 예문은 별도의 C#코드는 필요 없다. txt1이 소스 객체가 되고 txt2가 타겟 객체가 되어 소스의 Text 속성의 값을 타겟 txt2의 Text 속성에 바인딩 시킨다.

<StackPanel Orientation="Vertical" Margin="20" >

        <TextBox Name="txt1"  Text="{Binding Mode=OneWay}" />

        <TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text}"/>

</StackPanel>

위쪽 TextBox에 값을 입력하며 아래쪽 TextBox에 자동 입력된다.

  • 위 코드를 수정하여 양방향바인딩으로 만들어보자.
  • 위쪽 TextBox에서 입력을 하면 아래에 자동 반영 되지만, 아래쪽 TextBox에서 입력을 하면 바로 반영은 안되고 포커스를 잃는경우에만 하는 경우에 상단의 TextBox에 반영된다. (양방향에서 타겟이 소스를 UPDATE하는 타이밍은 UpdateSourceTrigger 속성으로 지정하는데 대부분의 의존 속성 기본값이 PropertyChanged인 반면 Text 속성은 기본값이 LostFocus 입니다.)

<TextBox Name="txt1"  Text="{Binding Path=Text, Mode=TwoWay}" />

        <TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text}"/>


최종적으로 아래와 같이 UpdateSourceTrigger 절을 타겟객체쪽에 추가하자. 소스를 갱신할 타이밍을 지정하는 곳이고 Text 속성인 경우 기본값은 포커스를 잃을 때(LostFocus)이다.

<TextBox Name="txt1"  Text="{Binding Path=Text, Mode=TwoWay}" />

<TextBox Name="txt2"  

Text="{Binding Source={x:Reference txt1},Path=Text, 

UpdateSourceTrigger =PropertyChanged}"/>

다른 예문을 살펴보자.

public partial class MainWindow {

public MainWindow()

{

  InitializeComponent();


  // create a model object

  _viewmodel = new MyViewModel()

  {

    Date = new DateTime(201171),

    Title = "WPF User Group"

  };


  // bind the Date to the UI

  this.DataContext = _viewmodel;

}

}


<Grid x:Name="LayoutRoot" Background="White">

  ...


  <TextBlock Text="Name:"

              Grid.Row="1"/>

  <TextBox Text="{Binding Path=Title, Mode=TwoWay}"

           Grid.Row="1" Grid.Column="1"/>


  <TextBlock Text="Date:"

              Grid.Row="2"/>

  <sdk:DatePicker SelectedDate="{Binding Path=Date, Mode=TwoWay}"

                  Grid.Row="2" Grid.Column="1"/>

</Grid>


#WPF데이터바인딩, #데이터바인딩, #DataBinding, #WPF교육, #WPF강의, #WPF동영상, #WPF학원,WPF데이터바인딩, 데이터바인딩, DataBinding, WPF교육, WPF강의, WPF동영상, WPF학원


2021년 11월 21일 일요일

WPF DataBinding, IValueConverter를 이용한 데이터바인딩, WPf동영상, WPF교육, WPF학원

 

WPF DataBinding, IValueConverter를 이용한 데이터바인딩, WPf동영상, WPF교육, WPF학원

http://ojc.asia/bbs/board.php?bo_table=WPF&wr_id=181 


WPF DataBinding, IValueConverter를 이용한 데이터바인딩

WPF DataBinding, IValueConverter를 이용한 데이터바인딩데이터바인딩시 소스와 타겟의 데이터 타입이 다른 경우가 있다. 예를 들면 체크박스의 체크여부에 따라 “예”, “아니오” 등을 표시하는 경

ojc.asia


https://www.youtube.com/watch?v=YaiFRTypMhM&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=19&t=1s 

https://www.youtube.com/watch?v=GAw8eSawrvE&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=20&t=11s 

  • 데이터바인딩시 소스와 타겟의 데이터 타입이 다른 경우가 있다. 예를 들면 체크박스의 체크여부에 따라 “예”, “아니오” 등을 표시하는 경우 또는 파일 크기가 바이트이지만 파일의 크기에 따라 바이트, 킬로바이트, 메가 바이트 또는 기가 바이트로 표시하려고 하는 경우가 그렇다.
  • 데이터바인딩시 타입의 변경을 위해 IValueConverter가 존재하며 IValueConverter 인터페이스를 구현하는 클래스가 소스와 대상 사이의 값을 변환한다.
  • WPF 값 변환기는 IValueConverter 인터페이스 또는 IMultiValueConverter 인터페이스 를 구현해야 하며 두 인터페이스 모두 Convert() 및 ConvertBack()의 ​​두 가지 메서드 만 구현하면 된다.
  • 문자열을 입력으로 불리언(Boolean) 값을 반환하는 간단한 변환기를 구현해 보자.
  • [실행화면]


  • [YesNoToBoolConverter.cs]


using System;

using System.Windows.Data;

namespace WpfApp12

{

    class YesNoToBoolConverter : IValueConverter

    {

        // 소스값이 타겟에 바인딩 되는 경우 호출

        // TextBox >> TextBlock, TextBox >> CheckBox

        // TextBox의 Text속성의 값 "YES", "NO"에 따리 true, false를 리턴

        public object Convert(object value, Type targetType, object param, System.Globalization.CultureInfo culture)

        {

            switch (value.ToString().ToUpper())

            {


                case "YES"return true;

                case "NO"return false;

            }

            return false;

        }


        // 타겟값이 역으로 소스에 바인딩 될때 호출

        // CheckBox --> TextBox

        // CheckBox의 값 true, false에 따라 "YES", "NO" 문자열을 리턴

        public object ConvertBack(object value, Type targetType, object param, System.Globalization.CultureInfo culture)

        {

            if (value is bool)

            {

                if ((bool)value == truereturn "YES";

                else return "NO";

            }

            return "NO";

        }

    }


}


  • [MainWindow.xaml]


<Window x:Class="ConverterTest.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:ConverterTest"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>

        <local:YesNoToBoolConverter x:Key="converter"/>

    </Window.Resources>

    <StackPanel>

        <TextBox Name="txtValue" Text="YES"/>

        <WrapPanel>

            <TextBlock Text="Current Value : "/>

            <TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource converter}}"/>

        </WrapPanel>

        <CheckBox Content="Yes" IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource converter}}" />

    </StackPanel>

</Window>


#WPFDataBinding, #DataBinding, #IValueConverter, #데이터바인딩, #WPF교육, #WPF강좌, #WPF강의 

WPFDataBinding, DataBinding, IValueConverter, 데이터바인딩, WPF교육, WPF강좌, WPF강의 

WPF 데이터 바인딩을 이용하여 오라클 EMP 테이블 데이터를 ListView에 뿌리기(ODP.NET, ItemTemplate, Linq쿼리, OracleDataAdapter),wpf학원

 

WPF 데이터 바인딩을 이용하여 오라클 EMP 테이블 데이터를 ListView에 뿌리기(ODP.NET, ItemTemplate, Linq쿼리, OracleDataAdapter),wpf학원

http://ojc.asia/bbs/board.php?bo_table=WPF&wr_id=177 


WPF 데이터 바인딩을 이용하여 오라클 EMP 테이블 데이터를 ListView에 뿌리기(ODP.NET,OracleDataAdapter, Li

WPF 데이터 바인딩을 이용하여 오라클 EMP 테이블 데이터를 ListView에 뿌리기(ODP.NET, ItemTemplate, Linq쿼리, OracleDataAdapter)ODP.NET을 이용하여 오라클 DB의 EMP 테이블의 내용을 ListView에 출력하는 예제를

ojc.asia


https://www.youtube.com/watch?v=TA1eChovYEU&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=8 


https://www.youtube.com/watch?v=2iD0UZBuWgs&list=PLxU-iZCqT52Cmj47aKB1T-SxI33YL7rYS&index=3 

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html 

  • 오라클 클라이언트 설치 후 오라클홈(C:\app\사용자\product\11.2.0\client_1) 디렉토리 아래 NETWORK\Admin 폴더의 tnsnames.ora 파일에 속하고자 하는 Oracle Server의 접속정보 추가

// ONJ라는 TNS NAME을 정의하는데 C# 코드에서 “TOPCREDU”를 DB 접속 자열의 Data Source 항목에 기술한다.

TOPCREDU =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = topcredu) //DB명

    )

  )

  • WPF 응용프로그램 형태의 프로젝트를 생성(프로젝트명 : WpfOracleTest)
  • 참조 추가 : 프로젝트 생성 후 솔루션 탐색기 -> 참조 -> 참조추가 선택 후 확장 >> Oracle.MaangedDataAccess를 선택하여 추가하자. 오라클홈\network\admin 아래에 tnsnames.ora을 생성
  • 테스트 PC가 64Bit 라면 프로젝트에서 마우스 오른쪽 속성 선택 후 빌드 -> 플랫폼 대상(Target Platform)을 x64로 선택한다. (32Bit인 경우 생략)
  • EmpViewModel.cs

using System;

using System.ComponentModel;

using System.Windows.Input;


namespace WpfOracleTest

{

    public class EmpViewModel {        

        int empno = 0;

        string ename = string.Empty;

        string job = string.Empty;


        // public 프로퍼티

        public int Empno

        {

            get { return empno; }

            set { this.empno = value;  }

        }


        // public 프로퍼티

        public string Ename

        {

            get { return ename; }

            set { this.ename = value; }

        }


        // public 프로퍼티

        public string Job

        {

            get { return job; }

            set { this.job = value; }

        }

    }

}


  • MainWindow.xaml

<Window x:Class="WpfOracleTest.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:WpfOracleTest"

        mc:Ignorable="d"

        Title="MainWindow" Height="350" Width="461.659">

    <Grid Margin="0,0,3.2,-0.2">

        <Button x:Name="button" Content="DB Connect" HorizontalAlignment="Left" Margin="43,28,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.391,-0.29" Click="DB_Connect"/>

        <ListView Margin="10,66,10,10" Name="lstView">

            <ListView.ItemTemplate>

                <DataTemplate>

                    <WrapPanel>

                        <TextBlock Text="Empno: " />

                        <TextBlock Text="{Binding Empno}" FontWeight="Bold" />

                        <TextBlock Text=", " />

                        <TextBlock Text=" (" />

                        <TextBlock Text="Ename: " />

                        <TextBlock Text="{Binding Ename}" TextDecorations="Underline"  FontWeight="Bold" />

                        <TextBlock Text=")" />

                        <TextBlock Text="{Binding Job}"  Foreground="Blue" Cursor="Hand" />

                    </WrapPanel>

                </DataTemplate>

            </ListView.ItemTemplate>

        </ListView>

        <Button x:Name="button1" Content="Get Data" HorizontalAlignment="Left" Margin="137,28,0,0" VerticalAlignment="Top" Width="75" Click="Select_Emp"/>

    </Grid>

</Window>

  • MainWindow.xaml.cs

using System;

using System.Collections.Generic;

using System.Windows;

using System.Data;

using Oracle.ManagedDataAccess.Client;


namespace WpfOracleTest

{

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

        }


        OracleConnection conn;


        private void DB_Connect(object sender, RoutedEventArgs e)

        {

            try

            {

                string strCon = "data source=topcredu;User ID=scott;Password=tiger";

                conn = new OracleConnection(strCon);

                conn.Open();


                MessageBox.Show("DB Connection OK!");


            }

            catch(Exception error)

            {

                MessageBox.Show(error.ToString());

            }            

        }


        private void Select_Emp(object sender, RoutedEventArgs e)

        {

            string sql = "select empno, ename, job from emp ";


            OracleCommand comm = new OracleCommand();

            if(conn == null) DB_Connect(thisnull);

            comm.Connection = conn;

            comm.CommandText = sql;

                        

            OracleDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection);


            List<EmpViewModel> emps = new List<EmpViewModel>();


            while (reader.Read())

            {

                emps.Add(new EmpViewModel() { Empno = reader.GetInt32(reader.GetOrdinal("empno")),

                                              Ename = reader.GetString(reader.GetOrdinal("ename")),

                                              Job = reader.GetString(reader.GetOrdinal("job"))

                });

            }


            lstView.ItemsSource = emps;

            reader.Close();

        }

    }

}


  • 실행화면


6.16 OracleDataAdapter, ListView, 데이터 바인딩을 이용하여 오라클 EMP 테이블 데이터를 ListView에 뿌리기(ODP.NET, ItemTemplate)

  • 이전 예제에 버튼을 하나 추가하고 버튼을 클릭했을 때 OracleDataAdapter를 이용하여 DataSet에 DataTable로 EMP 테이블을 생성하고 이를 LiveView에 바인딩 시키는 기능을 추가해 보자.
  • MainWindow.xaml

<Window x:Class="WpfOracleTest.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:WpfOracleTest"

        mc:Ignorable="d"

        Title="MainWindow" Height="350" Width="461.659">

    <Grid Margin="0,0,3.2,-0.2">

        <Button x:Name="button" Content="DB Connect" HorizontalAlignment="Left" Margin="43,28,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.391,-0.29" Click="DB_Connect"/>

        <ListView Margin="10,66,10,10" Name="lstView">

            <ListView.ItemTemplate>

                <DataTemplate>

                    <WrapPanel>

                        <TextBlock Text="Empno: " />

                        <TextBlock Text="{Binding Empno}" FontWeight="Bold" />

                        <TextBlock Text=", " />

                        <TextBlock Text=" (" />

                        <TextBlock Text="Ename: " />

                        <TextBlock Text="{Binding Ename}" TextDecorations="Underline"  FontWeight="Bold" />

                        <TextBlock Text=")" />

                        <TextBlock Text="{Binding Job}"  Foreground="Blue" Cursor="Hand" />

                    </WrapPanel>

                </DataTemplate>

            </ListView.ItemTemplate>

        </ListView>

        <Button x:Name="button1" Content="Get Data" HorizontalAlignment="Left" Margin="137,28,0,0" VerticalAlignment="Top" Width="75" Click="Select_Emp"/>

        <Button x:Name="button2" Content="Get Data from Adapter" HorizontalAlignment="Left" Margin="228,28,0,0" VerticalAlignment="Top" Width="133" Click="Select_Emp2"/>

    </Grid>

</Window>


  • MainWindow.xaml.cs

using System;

using System.Collections.Generic;

using System.Windows;

using System.Windows.Controls;

using System.Data;

using Oracle.ManagedDataAccess.Client;


namespace WpfOracleTest

{


    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

        }


        OracleConnection conn;


        private void DB_Connect(object sender, RoutedEventArgs e)

        {

            try

            {

                string strCon = "data source=topcredu;User ID=scott;Password=tiger";

                conn = new OracleConnection(strCon);

                conn.Open();


                MessageBox.Show("DB Connection OK!");


            }

            catch(Exception error)

            {

                MessageBox.Show(error.ToString());

            }            

        }


        private void Select_Emp(object sender, RoutedEventArgs e)

        {

            string sql = "select empno, ename, job from emp ";


            OracleCommand comm = new OracleCommand();

            if(conn == null) DB_Connect(thisnull);

            comm.Connection = conn;

            comm.CommandText = sql;

                        

            OracleDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection);

            List<EmpViewModel> emps = new List<EmpViewModel>();

            while (reader.Read())

            {

                emps.Add(new EmpViewModel() { Empno = reader.GetInt32(reader.GetOrdinal("empno")),

                                              Ename = reader.GetString(reader.GetOrdinal("ename")),

                                              Job = reader.GetString(reader.GetOrdinal("job"))

                });

            }


            lstView.ItemsSource = emps;

            reader.Close();

        }


        private void Select_Emp2(object sender, RoutedEventArgs e)

        {


            OracleDataAdapter adapter = new OracleDataAdapter();


            string sql = "select empno, ename, job from emp ";


            OracleCommand comm = new OracleCommand();

            if (conn == null) DB_Connect(thisnull);

            comm.Connection = conn;

comm.CommandText = sql;


            adapter.SelectCommand = comm;

 

            DataSet ds = new DataSet("emps");

            adapter.Fill(ds, "emp");


            // Clear the ListView control

            lstView.Items.Clear();


            List<EmpViewModel> emps = new List<EmpViewModel>();


            for (int i = 0; i < ds.Tables["emp"].Rows.Count; i++)

            {

                DataRow dr = ds.Tables["emp"].Rows[i];

                emps.Add(new EmpViewModel()

                {

                    Empno = System.Convert.ToInt32(dr["empno"]),

                    Ename = dr["ename"].ToString(),

                    Job = dr["job"].ToString()

                });

            }


            lstView.ItemsSource = emps;

            conn.Close();

        }

    }

}


  • 실행화면


6.17 Linq쿼리식,OracleDataAdapter, LiveView, 데이터 바인딩을 이용하여 오라클 EMP 테이블 데이터를 ListView에 뿌리기(ODP.NET, ItemTemplate)

  • 이전 예제에 버튼을 하나 더 추가하고 버튼을 클릭했을 때 OracleDataAdapter를 이용하여 DataSet에 DataTable로 EMP 테이블을 생성하고 이를 Linq 쿼리식을 이용하여 LiveView에 바인딩 시키는 기능을 추가해 보자.
  • MainWindow.xaml

<Window x:Class="WpfOracleTest.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:WpfOracleTest"

        mc:Ignorable="d"

        Title="MainWindow" Height="350" Width="461.659">

    <Grid Margin="0,0,3.2,-0.2">

        <Button x:Name="button" Content="DB Connect" HorizontalAlignment="Left" Margin="20,28,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.391,-0.29" Click="DB_Connect"/>

        <ListView Margin="10,66,10,10" Name="lstView">

            <ListView.ItemTemplate>

                <DataTemplate>

                    <WrapPanel>

                        <TextBlock Text="Empno: " />

                        <TextBlock Text="{Binding Empno}" FontWeight="Bold" />

                        <TextBlock Text=", " />

                        <TextBlock Text=" (" />

                        <TextBlock Text="Ename: " />

                        <TextBlock Text="{Binding Ename}" TextDecorations="Underline"  FontWeight="Bold" />

                        <TextBlock Text=")" />

                        <TextBlock Text="{Binding Job}"  Foreground="Blue" Cursor="Hand" />

                    </WrapPanel>

                </DataTemplate>

            </ListView.ItemTemplate>

        </ListView>

        <Button x:Name="button1" Content="Get Data" HorizontalAlignment="Left" Margin="114,28,0,0" VerticalAlignment="Top" Width="75" Click="Select_Emp"/>

        <Button x:Name="button2" Content="Get Data from Adapter" HorizontalAlignment="Left" Margin="205,28,0,0" VerticalAlignment="Top" Width="133" Click="Select_Emp2"/>

        <Button x:Name="button3" Content="From Linq" HorizontalAlignment="Left" Margin="357,28,0,0" VerticalAlignment="Top" Width="75" Click="Select_Emp3"/>

    </Grid>

</Window>


  • MainWindow.xaml.cs

using System;

using System.Collections.Generic;

using System.Windows;

using System.Windows.Controls;

using System.Data;

using Oracle.ManagedDataAccess.Client;

using System.Collections;

using System.Linq;


namespace WpfOracleTest

{

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

        }


        OracleConnection conn;


        private void DB_Connect(object sender, RoutedEventArgs e)

        {

            try

            {

                string strCon = "data source=topcredu;User ID=scott;Password=tiger";

                conn = new OracleConnection(strCon);

                conn.Open();


                MessageBox.Show("DB Connection OK!");


            }

            catch(Exception error)

            {

                MessageBox.Show(error.ToString());

            }            

        }


        /* Connection, Command, DataReader를 통한 데이터 추출 */

        private void Select_Emp(object sender, RoutedEventArgs e)

        {

            string sql = "select empno, ename, job from emp ";


            OracleCommand comm = new OracleCommand();

            if(conn == null) DB_Connect(thisnull);

            comm.Connection = conn;

            comm.CommandText = sql;

                        

            OracleDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection);

            List<EmpViewModel> emps = new List<EmpViewModel>();

            while (reader.Read())

            {

                emps.Add(new EmpViewModel() { Empno = reader.GetInt32(reader.GetOrdinal("empno")),

                                              Ename = reader.GetString(reader.GetOrdinal("ename")),

                                              Job = reader.GetString(reader.GetOrdinal("job"))

                });

            }


            lstView.ItemsSource = emps;

        }


        /* OracleDataAdapter를 통한 EMP 테이터 추출 */

        private void Select_Emp2(object sender, RoutedEventArgs e)

        {


            OracleDataAdapter adapter = new OracleDataAdapter();


            string sql = "select empno, ename, job from emp ";


            OracleCommand comm = new OracleCommand();

            if (conn == null) DB_Connect(thisnull);

            comm.Connection = conn;

            adapter.SelectCommand = comm;

            comm.CommandText = sql;

            DataSet ds = new DataSet("emps");

            adapter.Fill(ds, "emp");


            // Clear the ListView control

            lstView.Items.Clear();


            List<EmpViewModel> emps = new List<EmpViewModel>();

            for (int i = 0; i < ds.Tables["emp"].Rows.Count; i++)

            {

                DataRow dr = ds.Tables["emp"].Rows[i];

                emps.Add(new EmpViewModel()

                {

                    Empno = System.Convert.ToInt32(dr["empno"]),

                    Ename = dr["ename"].ToString(),

                    Job = dr["job"].ToString()

                });

            }


            lstView.ItemsSource = emps;

            conn.Close();

        }


        /* Linq 쿼리식을 통한 EMP 테이터 추출 */

        private void Select_Emp3(object sender, RoutedEventArgs e)

        {

            OracleDataAdapter adapter = new OracleDataAdapter();


            string sql = "select empno, ename, job from emp ";


            OracleCommand comm = new OracleCommand();

            if (conn == null) DB_Connect(thisnull);

            comm.Connection = conn;

            adapter.SelectCommand = comm;

            comm.CommandText = sql;

            DataSet ds = new DataSet("emps");

            adapter.Fill(ds, "emp");


            // Clear the ListView control

            lstView.Items.Clear();


            List<EmpViewModel> emps = new List<EmpViewModel>();

            IEnumerable query = from myemp1 in ds.Tables["emp"].AsEnumerable()

                       where myemp1["job"].Equals("CLERK")

                       select myemp1;


            foreach (DataRow dr in query)

            {

                emps.Add(new EmpViewModel()

                {

                    Empno = System.Convert.ToInt32(dr["empno"]),

                    Ename = dr["ename"].ToString(),

                    Job = dr["job"].ToString()

                });

            }


            lstView.ItemsSource = emps;

            conn.Close();

        }

    }

}


  • 실행화면


#WPF교육, #WPF오라클, #WPF데이터바인딩, #WPF오라클예제, #WPF학원, #WPFORACLE
WPF교육, WPF오라클, WPF데이터바인딩, 오라클데이터바인딩, WPFORACLE, 데이터바인딩, WPF오라클실습


(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...