public ItemSearchDialog(ItemSearchColumnProvider columnProvider, ItemSearchCellProvider cellProvider)
        {
            this.InitializeComponent();
            this.InitializeDialogStyle();

            this.columnProvider = columnProvider;
            this.cellProvider   = cellProvider;

            runSearchBtn.Click                    += (sender, args) => InvokeCustom(RunSearch);
            newSearchBtn.Click                    += (sender, args) => InvokeCustom(ClearSearch);
            getPreviousPage.Click                 += (sender, args) => InvokeCustom(PreviousPage);
            getNextPage.Click                     += (sender, args) => InvokeCustom(NextPage);
            cancelButton.Click                    += (sender, args) => InvokeCustom(Cancel);
            okButton.Click                        += (sender, args) => InvokeCustom(Ok);
            itemTypeBox.SelectedIndexChanged      += (sender, args) => InvokeCustom <ItemTypeItem>(ItemTypeChanged, (ItemTypeItem)itemTypeBox.SelectedItem);
            savedSearchesBox.SelectedIndexChanged += (sender, args) => InvokeCustom <SavedSearch>(SavedSearchChanged, (SavedSearch)savedSearchesBox.SelectedItem);
            tbPageSize.TextChanged                += TbPageSize_TextChanged;

            partsGrid.parentDialog          = this;
            partsGrid.CellValueChanged     += (sender, args) => this.InvokeCustom <int, string>(SearchValueChanged, args.ColumnIndex, partsGrid[args.ColumnIndex, args.RowIndex].Value?.ToString());
            partsGrid.CellMouseDoubleClick += (sender, args) =>
            {
                if (args.RowIndex > 0)
                {
                    InvokeCustom(Ok);
                }
            };
            partsGrid.CurrentCellDirtyStateChanged += (sender, args) =>
            {
                if (partsGrid.IsCurrentCellDirty)
                {
                    partsGrid.CommitEdit(DataGridViewDataErrorContexts.Commit);
                }
            };

            partsGrid.ColumnHeaderMouseClick += PartsGrid_ColumnHeaderMouseClick;
            partsGrid.SelectionChanged       += (sender, args) =>
            {
                if (partsGrid.SelectedRows.Count > 0)
                {
                    var idList = new List <string>();
                    foreach (DataGridViewRow item in partsGrid.SelectedRows)
                    {
                        idList.Add(item.Cells["id"].Value?.ToString());
                    }
                    InvokeCustom(SelectedItemChanged, idList);
                }

                if (partsGrid.CurrentRow != null && partsGrid.CurrentRow.Index > 0)
                {
                    okButton.Enabled = true;
                }
                else
                {
                    okButton.Enabled = false;
                }
            };
        }
        public ItemSearchPresenter GetItemSearchPresenter(ISearcher searcher)
        {
            var itemSearchColumnProvider = new ItemSearchColumnProvider();
            var itemSearchCellProvider   = new ItemSearchCellProvider();
            var dialog    = new ItemSearchDialog(itemSearchColumnProvider, itemSearchCellProvider);
            var presenter = new ItemSearchPresenter(dialog, searcher);

            return(presenter);
        }