모델 번호가 있는 데이터 세트를 Windows 형식으로 대체하고 POCO를 사용해 보십시오

13733 단어 WinFormsC#
개시하다
Windows 포맷DataGridView과 같은 데이터베이스 어플리케이션을 구축할 때
나는 데이터의 용기 사용 유형DataSet이 정식이라고 생각한다.
하지만 디자이너가 잘 못해서 이런 스타일링이 싫어요.
이번에는 모델DataSet 대신 일반 대상(POCO)을 데이터 용기로 사용했다.
BindingListViewDapper를 제3자의 라이브러리로 사용한다.
완성품은 여기에 두세요.
https://github.com/mono1729/BindingWithPoco
만든 물건
  • SQL Server의Northwind 샘플 데이터베이스를 표시하는 Products 테이블 내용을 보여주는 응용 프로그램을 제작한다.
  • 일람의 디스플레이 사용DataSet으로 머리 단추를 눌러 정렬할 수 있습니다.

  • 사용DataGridView도 데이터의 상세한 형식(그림의 하층)을 나타낸다.목록의 선택한 줄과 동기화를 표시합니다.
  • ProductName에서 추가 검색을 수행할 수 있는 텍스트 상자도 구성됩니다.
  • 데이터 업데이트는 바로 화면에 반영되고 테스트 버튼도 구성됩니다.("Add row", "Modify first row")

  • 제작 절차
    이번 응용 프로그램은 다음과 같은 절차에 따라 제작되었다.
  • Products표를 나타내는 기록된 데이터 만들기 BindingSource클래스

  • 클래스Product에서 구현Product
  • Visual Studio 데이터 소스 기능을 사용한 화면 디자인

  • 정의 대체INotifyPropertyChanged/DataTable의 모음DataView/BindingList<Product>
  • DapperBindingListView<Product>에서 데이터를 읽고 이를 바탕으로 생성BindingList<Product> 실례
  • BindingListView<Product>BindingListView<Product>BindingSource
  • DataSourceBindingSourceDataGridView
  • 증가분 검색 및 테스트 버튼 기능
  • POCO(Product) 만들기
    Products 테이블 데이터의 컨테이너 클래스를 준비합니다.
    데이터를 업데이트할 때 화면에 통지해야 하기 때문에 설치해야 한다DataSource.
    필드가 많으면 번거롭기 때문에 T4 텍스트 템플릿이나Fody를 사용하는 것이 좋습니다.
    Product.cs
    public class Product : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    
        private int _ProductID;
        public int ProductID
        {
            get { return _ProductID; }
            set
            {
                _ProductID = value;
                OnPropertyChanged("ProductID");
            }
        }
        private string _ProductName;
        public string ProductName
        {
            get { return _ProductName; }
            set
            {
                _ProductName = value;
                OnPropertyChanged("ProductName");
            }
        }
    /*以下略*/
    
    데이터 원본 기능을 사용하여 화면 설계를 진행하다
    만들어진 클래스를 Visual Studio 데이터 원본에 등록하고 창 디자이너에게 끌어다 놓으면 목록과 디테일을 만들 수 있습니다.
    함께 INotifyPropertyChangedBindingSource 부품이 배치되었지만, 이번에는 사용하지 않기 때문에BindingNavigator 없애주세요.

    모음집 바인딩 준비
    창의 코드 배경에 귀속할 모음집을 준비하십시오.
    데이터 저장용BindingNavigator과 귀속용BindingList<Product> 두 구성원을 준비합니다.
    Form1.cs
    using Equin.ApplicationFramework;
    namespace BindingWithPoco
    {
        public partial class Form1 : Form
        {
            private BindingList<Product> _products;
            private BindingListView<Product> _productsView;
    
    데이터 읽기 바인딩
    Micro-ORMBindingListView<Product>을 사용하여 Products 테이블의 데이터를 읽고 Dapper에 결과를 입력합니다.
    이것을 원시 데이터로 삼아 BindingList<Product> 대상BindingListView<Product>을 만듭니다.
    그런 다음 DataViewBindingListView<Product>로 설정합니다.BindingSource.DataSource에서 설정DataGridView.DataSource, 간접 참조BindingSource.
    Form1.cs
    using Dapper;
    public partial class Form1 : Form
    {
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            LoadData();
        }
    
        private void LoadData()
        {
            var connStr = Properties.Settings.Default.db;
            var conn = new SqlConnection(connStr);
            var sql = "SELECT * FROM Products;";
    
            _products = new BindingList<Product>(conn.Query<Product>(sql).ToList());
            _productsView = new BindingListView<Product>(_products);
            bindingSource1.DataSource = _productsView;
            dataGridView1.DataSource = bindingSource1;
        }
    
    필터 기능의 실현
    텍스트 상자를 배치하여 TextChanged 이벤트에서 필터링합니다.BindingListView<Product>BindingListView와 같은 필터식을 사용할 수 없습니다.
    익명으로 필터 조건을 설정합니다.
    Form1.cs
    public partial class Form1 : Form
    {
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            var inputLower = ((TextBox)sender).Text.ToLower();
            _productsView.ApplyFilter(p => p.ProductName.ToLower().Contains(inputLower));
        }
    
    작업 검증 버튼 설치DataTableINotifyPropertyChanged를 사용했기 때문에 화면 표시 후 데이터를 만지작거려도 화면에 변경 사항을 반영해야 한다.
    [Addrow] 버튼과 [Modify first row] 버튼을 설정하여 코드를 확인합니다.
    Form1.cs
    public partial class Form1 : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            _products.Add(new Product
            {
                ProductID = 999,
                ProductName = "Added!"
            });
        }
    
        private void button2_Click(object sender, EventArgs e)
        {
            _products[0].ProductName = "MODIFIED!";
        }
    
    동작 확인
    정렬 필터도 실행되고 데이터의 변경도 바로 화면에 반영된다.

    총결산
    이번에는 BindingList,INotifyPropertyChanged,BindingList를 사용하여 모델BindingListView과 같은 양방향 데이터로 연결된 Windows 표 응용을 구축할 수 있다.
    많은 시간이 걸리지만 DataSet/DataSet 이하의 기능을 실현할 수 없다.
  • 입력 값의 검증DataTable
  • 취소 줄의 상태와 변경DataRow.RowError, DataRow.RowState/DataTable.AcceptChanges
  • 테이블 간의 관계를 사용하는 기능DataTable.RejectChanges
  • 이 기능들을 설치하는 것이 어려워 보이기 때문에 모델DataSet.Relations을 솔직하게 사용하는 것이 행복할 수도 있는데...
    Enity Framework로 하면 가능할 것 같아서요.

    좋은 웹페이지 즐겨찾기