筆記摘要:
本視頻講述了在Windows窗體應用程序中實現課程信息動態綁定、數據校驗、實體封裝及保存後同步顯示的完整開發流程,重點解析了下拉框數據源綁定、DisplayMember與ValueMember設置、DataGridView數據展示配置及緩存更新機制。/n ---
### **準備工作:查詢並綁定課程分類下拉框
- **需求分析**
添加課程窗體中的“課程分類”下拉框需從 `cause_category` 表中動態讀取數據。
- **數據訪問層實現**
- 在 `cos_category_service` 類中編寫方法 `GetAllCategories`。
- SQL語句:`SELECT categoryID, name FROM cause_category`。
- 使用通用數據訪問類的 `GetReader` 方法執行查詢。
- 創建 `List<cos_category>` 集合用於存儲結果。
- 通過 `while (reader.Read())` 循環讀取每條記錄:
- 封裝 `categoryID`:`(int)reader["categoryID"]`。
- 封裝 `name`:`reader["name"].ToString()`。
- 關閉 `reader` 後返回 `list`。
---
### **業務邏輯層調用數據訪問層
- **引入命名空間**
在業務邏輯層引入 `DAL` 和 `Models` 命名空間。
- **創建服務對象**
實例化 `cos_category_service` 對象,命名為 `categoryService`。
- **封裝業務方法**
定義方法 `GetAllCategories`,直接調用 `categoryService.GetAllCategories()` 並返回結果,無額外業務邏輯。
---
### **窗體初始化:綁定下拉框數據源
- **構造函數中初始化**
窗體初始化操作放在構造方法中完成。
- **創建業務邏輯對象**
實例化 `CategoryManager`(即業務邏輯對象)。
- **設置數據源**
`cbb_category.DataSource = categoryManager.GetAllCategories();`
- **問題發現**
下拉框顯示的是對象類型名稱而非具體字段值。
---
### **解決下拉框顯示問題:設置DisplayMember和ValueMember [06:43](#?seek_t=403)**
- **DisplayMember 設置**
指定用户可見的內容字段:`cbb_category.DisplayMember = "name";`
- **ValueMember 設置**
指定實際保存到數據庫的值字段:`cbb_category.ValueMember = "categoryID";`
- **驗證效果**
重啓程序後,下拉框正確顯示分類名稱,並能獲取對應的 `categoryID` 作為外鍵值。
---
### **保存課程信息的核心步驟
#### **第一步:數據校驗
- 校驗用户輸入是否符合要求。
- 非空判斷為基礎。
- 數值型字段(如學分、課時)需驗證是否為整數。
- 複雜格式(如郵箱、身份證)可使用正則表達式(本次不展開)。
- 空值判斷作為作業由學員自行完成。
#### **第二步:封裝實體對象
- 創建 `cos` 實體對象。
- 屬性賦值:
- `cosName`:`txt_cos_name.Text.Trim()`
- `content`:`txt_content.Text.Trim()`
- `credit`(int):需進行類型轉換,如
- `hours`(int):同上。
- `categoryID`:從下拉框獲取選中值:
```csharp
cbb_category.SelectedValue // 返回object類型
(int)cbb_category.SelectedValue // 強制轉換為int
```
- `teacherID`:取自登錄時保存的全局對象:
```csharp
Program.currentTeacher.teacherID
```
#### **第三步:調用業務邏輯保存數據
- 創建 `costManager` 業務邏輯對象。
- 調用保存方法(假設為 `AddCourse(cos)`),傳入封裝好的 `cos` 對象。
- 返回值通常為影響行數,成功返回1,失敗拋出異常。
- 可根據返回值提示“添加成功”。
---
### **添加成功後同步更新DataGridView [17:40](#?seek_t=1060)**
#### **第四步:將新增課程加入緩存集合
- 創建臨時緩存集合:`List<cos> addedCourses = new List<cos>();`
- 添加成功後,將當前 `cos` 對象加入該集合。
#### **第五步:重新綁定DataGridView數據源
- **清空原數據源**
必須先清空 `dataGridView.DataSource`,否則無法同步新增項:
```csharp
dataGridView.DataSource = null;
```
- **重新設置數據源**
`dataGridView.DataSource = addedCourses;`
---
### **配置DataGridView列顯示
- **關鍵三屬性設置**
編輯列時必須設置以下三個屬性以確保正確綁定:
- `HeaderText`:列標題(如“課程名稱”)
- `DataPropertyName`:對應實體類屬性名(如 `cosName`)
- `Name`:列名(建議與屬性名一致)
- **禁止自動生成列**
防止出現多餘列:
```csharp
dataGridView.AutoGenerateColumns = false;
```
---
### **擴展實體屬性以顯示課程分類名稱
- **問題根源**
實體類 `cos` 中無 `categoryName` 屬性,導致無法直接顯示分類名稱。
- **解決方案:添加擴展屬性**
在 `cos` 類中增加一個非映射屬性:
```csharp
public string CategoryName { get; set; }
```
- **手動賦值**
在添加成功後,根據 `categoryID` 查找或直接從下拉框文本獲取:
```csharp
cos.CategoryName = cbb_category.Text;
```
- **綁定到DataGridView**
將新列的 `DataPropertyName` 設為 `CategoryName`。
---
### **總結與後續任務
- 完成一次完整的課程添加涉及多個環節:數據綁定、校驗、封裝、保存、緩存、刷新顯示。
- 強調用户體驗細節的重要性,如自動清除輸入框。
- **作業任務**:
- 實現輸入框的自動清空功能(勾選“保存後清空”選項時觸發)。
- 所有VIP學員需提交代碼供檢查。
- **預告內容**
下節課將講解課程信息的查詢、修改與刪除功能,建議提前預習。
思維導圖:
學習筆記:
1. 首先,需要將課程分類查詢出來並綁定到下拉框中,這是實現動態展示的關鍵步驟,確保了用户界面的靈活性和交互性。 2. 接着,找到並使用cos category service數據訪問類,這是操作課程分類數據的基礎,保證了數據的準確性和實時性。 3. 在操作過程中,引入必要的命名空間,以確保代碼的正確執行和功能的實現,這是技術實現的重要環節。 4. 通過多次測試腳本,確保動態展示功能的穩定性和可靠性,這是提升用户體驗和系統性能的必要措施。 5. 忽略重複操作,專注於核心功能的實現,這是提高開發效率和代碼質量的有效策略,確保了項目進度和資源的有效利用。
1. 為了鞏固所學知識,通過分層練習,項目設計返回一個課程對象列表,強調了get cost方法在處理多個返回結果時的重要性。 2. 在編寫查詢方法時,考慮到不需要額外參數,僅需category的name和ID,使用了格式化的搜索語句,展示了不同搜索方式的適用場景。 3. 通過調用通用數據範圍內的get reader方法,將SQL語句傳入,實現了從數據庫中讀取數據的功能,體現了方法的調用和參數傳遞過程。 4. 為保存查詢結果,預先準備了一個list集合,專門用於存儲cos category對象,這一設計確保了數據的有序性和結構化管理。 5. 整個對話內容圍繞着如何在項目中實現查詢方法展開,強調了從數據庫獲取數據、處理數據和展示數據的全過程,為學習者提供了實踐指導。
1. 封裝課程分類對象,通過讀取數據並將其轉換為int類型和字符串類型,分別對應category ID和name,然後添加到集合中。 2. 在業務邏輯層中引入DAL和models,創建cos category service對象,用於處理課程分類的業務邏輯。 3. 實現get方法,直接返回從數據訪問層獲取的課程分類集合,簡化業務處理流程。 4. 確保在數據讀取和封裝完成後關閉資源,避免資源泄露,提高程序的健壯性和效率。 5. 在展示層調用業務邏輯層的方法,展示課程分類信息,實現數據的可視化呈現。
1. 在窗體初始化時,將動態填充課程分類下拉框的邏輯放置在構造方法中,確保界面元素在加載時自動更新。 2. 引入業務邏輯對象CategoryManager,通過調用getAllCategories方法獲取所有課程分類,實現數據源的動態綁定。 3. 發現下拉框顯示不正確,所有選項顯示為對象類型,需進一步設置displayMember屬性,以正確展示課程分類的名稱。 4. 通過設置displayMember屬性,指定下拉框中顯示的字段,解決顯示問題,使用户界面更加友好和直觀。 5. 在實際應用中,需注意檢查和設置相關屬性,確保數據綁定的完整性和界面的正確顯示,提升用户體驗。
1. 在點擊保存時,我們需要明確從數據表中獲取的具體內容,而非簡單保存name字段,這涉及數據處理邏輯的調整。 2. 為了正確處理數據,我們應關注並獲取value member,而非科技QID,這要求我們對後台數據獲取邏輯進行相應的設置和調整。 3. 討論中提到的Y6 member,可能是具體數據表中的一個關鍵字段,需要在保存邏輯中正確識別和處理,以確保數據的準確性和完整性。 4. 整個過程強調了在數據處理中,準確識別和處理特定字段(如value member)的重要性,以避免保存錯誤或不相關的信息。 5. 通過調整和優化數據獲取與保存的邏輯,可以提升系統的數據處理效率和準確性,確保用户操作(如點擊保存)後的數據狀態符合預期。
1. 確認使用ITID作為外鍵,以確保下拉框功能正常,這是綁定操作的關鍵步驟,保證數據的正確關聯。 2. 強調理解並掌握外鍵概念的重要性,對於後續操作的順利進行至關重要,是數據管理的基礎。 3. 説明當用户點擊保存到數據庫時,應確保所有數據正確無誤地存儲,這是完成用户操作的必要步驟。 4. 指出準備工作完成後,接下來的操作是實現用户與數據庫的交互,確保數據的準確保存。 5. 提醒在操作過程中,需關注每個細節,確保流程順暢,這是提升用户體驗和系統穩定性的關鍵。
1. 對話中提到,單純的非空判斷不足以滿足開發需求,還需要判斷數據類型是否為整數,以及更復雜的格式如電子郵件和身份證號。 2. 開發者在面對複雜格式的驗證時,直接編寫代碼會顯得繁瑣,因此建議使用正則表達式來簡化這一過程。 3. 正則表達式是一種強大的工具,能夠幫助開發者高效地處理和驗證數據格式,但其學習和應用需要一定基礎和經驗。 4. 對話建議有興趣或有基礎的開發者深入研究正則表達式,以提升在數據驗證方面的開發效率和代碼質量。 5. 雖然正則表達式在數據驗證中具有重要作用,但對話也提到在系統深入學習時再詳細講解,表明了其學習的循序漸進性。
1. 對話中強調了空值判斷的重要性,建議學員自行完成這一基礎操作,作為作業的一部分,特別是在登錄模塊中,以鞏固所學知識。 2. 提及在實際開發中,可以進一步利用控件進行二次開發,封裝具有驗證功能的文本框,以提升用户體驗和代碼複用性,但當前課程暫不深入討論。 3. 討論了數據封裝的過程,即如何將用户輸入的數據保存到實體對象中,這是分層設計中的關鍵步驟,學員應已掌握相關技能。 4. 通過示例展示瞭如何給對象屬性賦值,例如通過獲取文本框內容並去除前後空格後賦值給cos name屬性,確保數據的準確性和整潔性。 5. 強調了學習過程中實踐的重要性,鼓勵學員在遇到簡單任務時主動完成,以培養獨立解決問題的能力,同時為後續複雜任務打下堅實基礎。
1. 在課程內容設計時,必須確保數據類型的正確轉換,特別是將學分課時從字符串類型轉換為int類型,以避免運行時錯誤。 2. 封裝時採用的格式可能不適用於所有場景,尤其是當涉及到特定類型如offset時,使用字符串格式可能導致程序出錯,需謹慎選擇數據類型。 3. 課程分類ID的獲取是關鍵步驟,通過下拉框選擇課程類型,如Dollar T對應值10,Java對應值12,需正確解析並應用這些值。 4. 瞭解並掌握如何從下拉框中獲取對應值,例如,選擇Java時應獲取其分類ID12,這對於實現功能的準確性至關重要。 5. 在處理課程分類時,需注意不同分類如微信小程序賬號對應ID11,確保數據獲取的準確性和邏輯的連貫性,以支持後續功能實現。
1. 對話中提到的下拉框提供了一個名為select的屬性,用於處理用户選擇,其value屬性綁定選中項對應的I地址。 2. 由於涉及到outside類型,對話強調在封裝過程中必須進行強制類型轉換,以確保數據類型的正確性。 3. 詳細解釋了select屬性的工作原理,即當用户選擇一個選項時,其對應的I地址將被綁定到select的value屬性上。 4. 對話指出,為了使系統能夠正確處理外部類型的數據,強制類型轉換是必要的步驟,這有助於避免類型不匹配的錯誤。 5. 整個討論圍繞如何在下拉框組件中正確使用select屬性和處理數據類型轉換,以實現功能的正常運行。
1. 對話中提到在數據上進行int類型的轉換,確保了數據處理的正確性。 2. 提及了teacher ID的缺失問題,但通過登錄時保存的提示對象,滿足了獲取登錄者信息的需求。 3. 強調了在項目中使用登錄保存對象的必要性,體現了其在需求實現中的關鍵作用。 4. 討論了需求設定,即獲取登錄者信息,無需額外的teacher ID,簡化了系統設計。 5. 總結了對話的核心,即通過合理利用現有資源,解決了項目中的數據類型轉換和用户信息獲取問題。
1. 對話中提到通過特定程序和操作(如點擊current teacher和teach ID)來滿足業務需求,強調實際開發中可能需要採用不同的方法。 2. 強調登錄用户ID的重要性,指出實際開發中可能有其他選擇,但默認設置需符合特定需求。 3. 提及參數數量(246個值)必須滿足六個值的要求,否則會導致參數缺失,系統報錯。 4. 説明參數數量的準確性對系統運行至關重要,少於六個值將導致錯誤。 5. 整體對話圍繞參數設置和系統需求展開,強調了遵循規定參數數量的重要性,以避免運行時錯誤。
1. 對象放置完成後,下一步是調用後台提交保存功能,即執行業務邏輯處理。 2. 創建層面變量cost manager,用於在當前位置進行對象操作和調用。 3. 調用cost manager的ID,將cost對象傳遞給它,以實現數據的保存或更新。 4. 討論是否需要設置返回值,指出在沒有異常處理的情況下,接收返回值的意義不大。 5. 強調在預科學習階段,異常處理的添加並非重點,可暫時省略以簡化流程。
1. 對話討論了系統操作結果的判定邏輯,確認成功時返回1,失敗則拋出異常,無需額外業務邏輯。 2. 提議將成功判定的處理邏輯移至另一位置,以簡化當前流程,提高代碼可讀性與維護性。 3. 討論了在系統操作中添加set全站與上位機加200的可行性,作為操作成功後的處理步驟。 4. 強調了測試操作結果的重要性,確保系統操作按預期執行,特別是在成功與失敗的處理邏輯上。 5. 交流中體現了團隊成員對系統邏輯優化與異常處理的關注,旨在提升系統穩定性和用户體驗。
1. 通過設置課時為五百,分值為三十,並選擇端的開發,成功將數據保存至數據庫,驗證了數據提交流程的正確性。 2. 使用F11單步運行,檢查搜索語句參數的傳遞與執行情況,確認無誤,進一步驗證了系統的功能完整性。 3. 在數據庫中查詢最後一條記錄,確認添加操作成功,數據準確無誤地被存儲,證明了數據持久化的有效性。 4. 探討在添加成功後,如何在系統中顯示新添加的數據,體現了對用户界面反饋重要性的認識。 5. 整個過程展示了從數據輸入、處理到存儲的完整流程,以及對系統功能的全面測試,確保了系統的穩定性和可靠性。
1. 在每次添加對象後,應將其保存至臨時緩存中,確保數據的即時更新與同步展示。 2. 創建一個列表作為數據源,用於在data view中展示所有添加的對象,強調列表在數據管理中的核心作用。 3. 通過將添加的對象保存到列表中,可以實現在data view中的實時顯示,提高數據處理的效率與準確性。 4. 強調使用list或重點加list的重要性,以實現數據的高效管理和動態展示。 5. 整個過程需注意數據的一致性和實時性,確保在data view中準確無誤地反映最新添加的內容。
1. 對話中討論了設置data view數據源的具體操作,提議將其設置為當前ID的成本,以簡化流程並提高效率。 2. 提出在設置數據源時,應直接關聯到data view的data south the soft,確保數據的準確性和實時性。 3. 為了提升用户體驗,建議在啓動時默認設置,減少用户操作步驟,同時引入“donate”概念,可能與數據源設置或功能擴展有關。 4. 強調了在操作過程中,應注重細節,比如添加“donate”功能,避免重複輸入,提高工作效率。 5. 對話最後,雙方同意先嚐試設置方案,通過啓動測試驗證其可行性和效果,體現了實踐驗證的重要性。
1. 課程名稱作為文本屬性,需與data property name保持一致,以確保數據綁定無誤。 2. data property name的設定應與cos實體類屬性對應,便於後續查找和維護。 3. 強調屬性名稱的一致性,避免因命名差異導致的查找困難和數據綁定問題。 4. 正確設置data property name是保證數據準確綁定的關鍵步驟,不容忽視。 5. 在定義屬性時,應參照cos實體類,確保屬性名準確無誤,以提升數據處理效率。
1. 在初始化時設置"auto generate columns"屬性為false,以禁止自動生成列,防止出現多餘列,確保界面整潔。 2. 通過調整屬性設置,解決內容被擠出或無法正常顯示的問題,保證所有信息按預期展示。 3. 確認調整後界面顯示無誤,確保所有需要顯示的內容正確呈現,無多餘或缺失部分。 4. 強調在開發過程中注意屬性設置的重要性,以避免界面佈局和內容顯示的異常。 5. 通過實際操作驗證屬性設置的效果,確保問題得到解決,界面功能正常。
1. 對話中提到的問題是,當嘗試添加多個條目時,系統只顯示一個,原因是未清空和重新綁定數據源。 2. 解決問題的關鍵步驟是在每次設置後,需要清空interview的data source,以確保數據的正確同步。 3. 清空數據源後,重新綁定可以解決多次添加但只顯示一個條目的問題,確保所有添加的條目都能正確顯示。 4. 對話強調了在操作過程中,必須注意清空和重新綁定的必要性,以避免數據同步問題。 5. 通過遵循清空和重新綁定的指導,可以有效解決系統顯示不全的問題,確保數據的完整性和準確性。
1. 為了滿足特定需求,可以給實體增加擴展屬性,這種屬性在數據表中並不直接對應,而是用於顯示或查詢,增強了系統的靈活性。 2. 在處理數據時,可以通過簡單的擴展實體屬性方法,將需要的category等信息添加到實體中,即使數據表中原本沒有這一列,也能實現功能擴展。 3. 這種擴展方法在預科課程中已有所涉及,強調了根據實際需求靈活添加屬性的重要性,而非嚴格依賴數據表結構。 4. 擴展屬性的封裝需單獨處理,這要求在編程或數據處理時,要特別注意如何將這些額外的信息正確地添加到實體對象中,以確保數據的一致性和準確性。 5. 通過這種方式,即使在數據表結構不變的情況下,也能實現系統功能的擴展和優化,為用户提供更加豐富和個性化的信息展示或查詢服務。
1. 對話中討論了屬性修改的重要性,指出應將屬性更改為“selected”或直接使用“text”,以確保與數據庫無關的同步顯示功能正常工作。 2. 強調了課程分類的正確綁定,確認在做出修改後,課程分類已成功更新,表明綁定過程無誤,確保了後續功能的正常運行。 3. 提及課時顯示問題,指出課時顯示未按預期更改,可能由於課時設置不一致,強調了課時信息同步顯示的重要性,以避免顯示錯誤。 4. 表達了對課時信息顯示異常的困惑,提出需再次檢查課時設置,以確保課時信息的準確顯示,避免因設置錯誤導致的顯示問題。 5. 討論了啓動應用後的課時顯示情況,儘管存在疑問,但通過觀察顯示結果,確認了部分功能的正確性,為後續問題排查提供了線索。
1. 對話中提到的問題是關於一個名為“克拉斯奧”的系統或功能,似乎在使用過程中遇到了保存或操作上的困擾,需要重新編輯或啓動來解決。 2. 對話者嘗試通過增加數值(如500,555)來驗證問題是否得到解決,暗示了問題可能與數據輸入或系統響應有關。 3. 提到“課時好,咱們再試一遍,咱們啓動一下”,説明對話者正在採取具體行動來測試或驗證系統的功能,以確認問題是否已被解決。 4. 對話中提及的“序號的添加”被標記為擴展內容,表明這可能是額外的功能或知識,對話者建議感興趣的聽眾可以自行搜索學習,顯示了對聽眾自主學習能力的信任。 5. 最後,對話者提到“我們改一個java好保存到數據庫”,這可能意味着問題的解決涉及到對數據庫操作的調整,暗示瞭解決方案可能需要編程或數據庫管理的知識。
1. 全站開發學員將獲得專門作業指導,涉及自動清除文本框功能的實現,作為重要學習內容。 2. 作業要求學員自行完成,旨在通過實踐加深對對象保存複雜性的理解,提升用户體驗。 3. 常老師講解的內容強調了完成對象保存需考慮的多方面因素,對提升技能至關重要。 4. 通過本次作業,學員將體會到實現功能背後的深思熟慮,以及對用户體驗的重視。 5. 強調了作業在學習過程中的重要性,鼓勵學員通過實踐掌握更多技能。
1. 對話強調了基礎操作雖簡單,但在實際項目中需考慮更多因素,提示學習者應深入理解並靈活應用所學知識。 2. 強調了常老師的教學方法,即通過講授核心內容和實踐經驗,為學習者提供框架和方向,鼓勵後續的深入學習。 3. 提醒學習者在完成學習VIP課程的編寫後,應及時提交作業,以便老師評估學習情況,確保學習進度。 4. 表示後續課程將涉及更復雜的內容,如課程查詢、修改和刪除,鼓勵學習者認真準備,逐步提升技能。 5. 整體對話旨在激勵學習者動手實踐,通過實際操作加深對知識的理解,為後續更深入的學習打下堅實基礎。