DB 中的 DataModel 實作了主從架構,該架構在系統中呈現為帶有多個 MasterTable 控制元件的 WinForm 和 Slave 控制元件的 Datagridview。MasterTable 欄位的所有控制元件都是通過一個 BindingSource 組件系結的,SlaveTable 的 Datagridview 使用自己的 BingindSource 作為 Fk 約束;通過這樣做,用戶可以通過 MasterTable 的系結“位置”在 MasterTable 的記錄中導航,這樣主要控制元件就會更新記錄的資料,并且 Datagridview 也基于 MasterTable 的 Pk 進行更新,這要歸功于Fk 約束(作為DataRelation實作并添加到 MasterTable 的 DataSet 中,因此,出現在它的 BindingSource 中)。
查看網路和論壇(如here),我發現如果我愿意,可以使用DataBinding.Add()以編程方式系結主要控制元件,即,為文本框中顯示的文本提供格式,如下所示:
......
mainBind = new BindingSource();
slaveBind = new BindingSource();
mainBind.DataSource = mainDS;
mainBind.DataMember = "MasterTable";
slaveBind.DataSource = mainBind;
slaveBind.DataMember = "idFk"; //defined as DataRelation between Master-Slave tables
DataGrid.DataSource = slaveBind;
Text1.DataBindings.Add("Text", mainBind, "field1", true, DataSourceUpdateMode.OnPropertyChanged, 19, "$##.00");
Text2.DataBindings.Add("Text", mainBind, "field2", true, DataSourceUpdateMode.OnPropertyChanged, DateTime.Now, "dd/MM/yyyy");
.....
通過這種方法,系統可以按預期作業。
現在,據我所知,如果您不愿意使用例如通過向導(或物體框架)的資料源,則無法避免以編程方式將每個控制元件添加到它的 BindingSource。這是真的?
另一方面(這是我在這里的真正問題),通過將 Datagridview 系結到 slaveBind 并且它是Fk 的成員,SlaveTable 中的所有欄位實際上都被加載和顯示,如果我需要操作它們(比如讓一些列不可見),我需要修改 SELECT 子句或以編程方式修改每一列(包括對齊或顯示格式之類的內容),如下所示:
.....
DataGrid.Columns[0].Visible = false; //field1
DataGrid.Columns[1].Visible = false; //field2
DataGrid.Columns[2].Visible = false; //field3
DataGrid.Columns[3].Width = 184; //field4
DataGrid.Columns[3].DefaultCellStyle.Format = "N1";
.....
因此,如果我想要另一種方法,例如通過 VS 編輯器將自己的列添加到 Datagridview 然后系結它們,我需要洗掉 fk 的系結源才能使其作業(如果不是,則自動加載資料);因此,我也失去了將 MasterTable 的 Pk 與 Datagridview 上顯示的資料保持聯系的可能性。
在這種情況下,是否可以避免以編程方式自定義每個 Datagridview 的列?
非常感謝任何愿意支持這個問題的人。
ps 不久前我在 YouTube 上看到一個視頻,它通過每次遍歷 MasterTable 記錄時清理和重新填充Datagridview來實作主從架構:這是唯一的解決方案嗎?
uj5u.com熱心網友回復:
因此,尋找一些莫名其妙相關,但不完全是我的問題后(我是想給我的第一的DataGridView的列配置為ComboBoxColumn - (來源1)(源2) - ),我發現它可以在添加列VS 設計器,在設計器中配置所有列(如數字格式、文本對齊等)后,您可以以編程方式系結每個列,然后,您可以將 Datagridview 與 Fk 的 BindingSource 系結(ps 這很重要設定 Datagridview 的AutoGenerateColumns屬性 = false)。
換句話說; 當 slaveBind 成為 DatagridView 的 DataSource 時,它??允許 DatagridView看到MasterTable和SlaveTable 的所有欄位!(感謝它的 DataRelation 成員 - 也就是 Fk -),同時保持 Datagridview 的資料與 MasterTable 的 Pk 相關聯,這是正在尋找的主要行為。
所以,為了完成起見,這里是我使用的代碼:
DataGridViewComboBoxColumn dgComboBox = new DataGridViewComboBoxColumn();
DataRelation relMPkToSId = new DataRelation("idFk", mainDS.Tables["MasterTable"].Columns["id_pk"], slaveDS.Tables["SlaveTable"].Columns["idPk"]);
mainDS.Relations.Add(relMPkToSId);
mainBind = new BindingSource();
slaveBind = new BindingSource();
mainBind.DataSource = mainDS;
mainBind.DataMember = "MasterTable";
slaveBind.DataSource = mainBind;
slaveBind.DataMember = "idFk"; //defined as DataRelation between Master-Slave tables
//Bind the Form's controls to the MasterTable's fields
myText1.DataBindings.Add("Text", mainBind, "masterField1", true, DataSourceUpdateMode.OnPropertyChanged, 19, "$##.00");
myText2.DataBindings.Add("Text", mainBind, "masterField2", true, DataSourceUpdateMode.OnPropertyChanged, DateTime.Now, "dd/MM/yyyy");
.....
myDataGrid.AutoGenerateColumns = false; //important
// configure ComboBoxColumn
dgComboBox.DataSource = comboDS.Tables["myCatalog1"]; //another DS which provides the ComboBox datalist
dgComboBox.DisplayMember = "displayName";
dgComboBox.ValueMember = "internal_id";
dgComboBox.HeaderText = "Title:";
dgComboBox.DataPropertyName = "slaveField1"; //target field at SlaveTable where the the selected ComboBox value is stored
myDataGrid.Columns.Insert(0, dgComboBox); //insert the ComboBoxColumn at the Datagridview's first position
myDataGrid.Columns[0].Name = "dgColumn1"; //give the ComboBoxColumn a reference name
myDataGrid.Columns["dgColumn1"].Width = 184; //configure the ComboBox's width
myDataGrid.Columns["dgColumn1"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft; //configure the ComboBox's alignment
//Bind the rest of the columns generated at the VS Designer
myDataGrid.Columns["column2"].DataPropertyName = "slaveField2";
myDataGrid.Columns["column3"].DataPropertyName = "slavefield3";
.....
myDataGrid.DataSource = slaveBind;
我希望這個結果對我相同情況下的其他人有所幫助。問候,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/318272.html
標籤:C# 视觉工作室 winforms 数据网格视图 主从
