基于ArcGIS10.0和Oracle10g的空間數據管理平臺四(C#開發)-通用數據管理模塊
上一篇文章把整個系統的主界面實現了,接下來就是實現主界面上提供的各個功能模塊。首先介紹的是通用數據管理模塊,為什么稱為通用數據呢?因為這些數據和我們平時使用關系型數據庫管理的數據是類似的,這里稱為通用數據主要是為了和空間數據做區別。
該模塊采用統一的界面來管理所有屬性數據表,可以同時做添加、刪除和修改,而且對于每一個表都是通用的操作。用戶選擇修改的表以后就建立一個數據集和這個表關聯,再將這個數據集綁定到數據顯示控件上,同時將數據集綁定到數據適配器上,當用戶對這個表的編輯操作完成以后并點擊保存按鈕就會將所有的更新操作與數據庫同步,這些功能都是調用數據適配器的接口完成。在與數據庫同步的時候會先查看是否有與之相關聯的表也需要同步更新,如果有就先更新關聯的表。為了保證數據庫中數據的一致性和完整性,就必須保證所有更新操作都能成功的完成或者都不完成,所以所有更新操作都在一個事務中進行,如果更新過程中遇到異常就回滾到最初狀態。整個過程的流程圖如下:

第一篇文章介紹這個功能的時候,我貼出了這個模塊運行的界面,從界面可以看出主要用到了兩個控件,左邊是一個樹形控件用于按類別顯示所有的屬性表的名稱,通過鼠標就可以選擇一個需要查看、修改的表,右邊是一個綁定了數據集的表數據顯示控件,在這個控件中可以刪除、添加和修改表的內容。除了這兩個主要控件以外,就是一些用于顯示文本提示的label控件和一些按鈕控件,按鈕主要用于控制用戶具體的某種操作,后面會詳細介紹每一個按鈕功能的實現。
首先定義了一些類的成員變量,每一個成員變量的作用如下代碼和注釋所示:
1 private OracleCommandBuilder builder;//用于構建適配器命令
2 private OracleDataAdapter da; //數據集適配器,用于同步控件與數據庫的操作
3 private DataSet ds;//數據集,可以是一個表也可以是多個表的集合
4 private string selectedNodeText;//記錄樹形節點選擇的文本
5 private string tableName;//記錄表的名稱
6 protected OracleConnection Connection;//Oracle連接
7 private bool isChanged = false;//控件綁定的數據是否有改變
8 private FrmShowLayer fsl;//用于顯示有空間對應表的可視化圖形(地圖)顯示
9 private bool bIdChange = false;//判斷表中的ID字段是否有改變,因為ID改變了會涉及到不同的操作
10 private bool bIdDel = false;//ID字段是否有刪除,用于級聯刪除
11 private bool bCellValueChange = false;//數據是否有改變
12 private ArrayList newIdList;//用于保存新增列的ID字段
13 private ArrayList oldIdList;//用于保存被改變列以前的ID字段
14 private ArrayList delIdList;//用于保存刪除列的ID字段
接著構造函數初始化一些變量:
1 newIdList = new ArrayList();
2 oldIdList = new ArrayList();
3 delIdList = new ArrayList();
在對話框或form的Load函數中初始化一些其他變量:
1 //Connection = new OracleConnection("Data Source=JCSJK;User Id=dzyj_jcsjk;Password=dzyj_jcsjk");
2 Connection = new OracleConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
3
4 Node tn = new Node();
5 tn.Text = "通用數據庫管理";
6
7 DataManagerTree.Nodes.Add(tn);
8 tn.Nodes.Add(new Node());
9 labelX1.Text += FrmMain.username;//顯示登錄的用戶名
上面代碼首先初始化Oracle的鏈接對象,然后為樹形控件添加一個根節點,添加具體的表分類目錄和具體的表名稱節點是在具體展開某一個節點的時候完成,這樣啟動這個功能界面的時候不會讓用戶等待太久,這個就是延遲初始化或加載。當然這種方式也有一個不好的地方,就是每次展開一個節點都會去重新初始化,這樣會降低一些用戶的體驗,而且程序執行很多不必要的重復工作。不過這個還是有解決方案的,就是首先判斷展開節點下面的子節點是否已經加載,如果已經加載就直接展開就可以了,不用再去重新新添加和初始化節點了。下面來具體解析怎樣實現數據的修改操作。
說明:所有的操作都要通過保存按鈕功能才是真正的同步到數據庫,可以同時做添加、刪除和修改操作以后一次性同步到數據庫,而且對于所有表都是同樣的操作,不過同時只能編輯一個表,如果編輯一個表以后沒有點擊保存按鈕保存到數據庫,那么所有的操作將會并取消。
1.刪除操作,通過用戶點擊刪除按鈕觸發,具體代碼實現如下:
1 /// <summary>
2 /// 刪除按鈕的響應事件實現
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void deleteBtn_Click(object sender, EventArgs e)
7 {
8 //首先判斷控件是否允許刪除,不允許就讓它允許
9 if (!dataGridViewX1.AllowUserToDeleteRows)
10 {
11 dataGridViewX1.AllowUserToDeleteRows = true;
12 }
13 if (dataGridViewX1.CurrentRow.Index < 0)
14 {
15 MessageBox.Show("請選擇需要刪除的一行");
16 return;
17 }
18
19 //判斷是不是這幾個表,如果是會涉及到級聯刪除
20 if (selectedNodeText == "DZYJ_JCSJK.city_code" || selectedNodeText == "DZYJ_JCSJK.county_code"
21 || selectedNodeText == "DZYJ_JCSJK.town_code" || selectedNodeText == "DZYJ_JCSJK.village_code"
22 || selectedNodeText == "DZYJ_JCSJK.enterprise_code")
23 {
24 if (MessageBox.Show("刪除這條記錄會刪除與之相關的其他表記錄,確認刪除?", "確認信息",
25 MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
26 {
27 bIdDel = true;
28 if (delIdList == null)
29 {
30 delIdList = new ArrayList();
31 }
32 delIdList.Add(dataGridViewX1.CurrentRow.Cells["ID"].Value.ToString());
33 }
34 else
35 {
36 return;
37 }
38 }
39
40 //ds.Tables[0].Rows[dataGridViewX1.CurrentRow.Index].Delete();
41 dataGridViewX1.Rows.Remove(dataGridViewX1.CurrentRow);//移除選擇的當前行
42 isChanged = true;//設置改變為真
43 saveBtn.Enabled = true;//使能保存按鈕,保存按鈕實現將改變同步到數據庫中去
44 //dataGridViewX1.Refresh();
45 }
2.添加操作
1 /// <summary>
2 /// 添加按鈕事件響應函數
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void addBtn_Click(object sender, EventArgs e)
7 {
8 /*if (!dataGridViewX1.AllowUserToAddRows)
9 {
10 dataGridViewX1.AllowUserToAddRows = true;
11 }*/
12 ((DataTable)dataGridViewX1.DataSource).Rows.Add();//添加一行用于插入數據
13 if (dataGridViewX1.ReadOnly)//如果控件是只讀屬性讓它可以編輯
14 {
15 dataGridViewX1.ReadOnly = false;
16 }
17 isChanged = true;
18 saveBtn.Enabled = true;
19 dataGridViewX1.FirstDisplayedScrollingRowIndex =
20 dataGridViewX1.Rows[dataGridViewX1.RowCount-1].Index;//視圖定位到添加這一行
21 }
3.編輯或更新操作(對于數據庫的update)
1 /// <summary>
2 /// 修改按鈕事件,使能DataGridView的編輯功能
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void modifyBtn_Click(object sender, EventArgs e)
7 {
8 if (dataGridViewX1.ReadOnly)
9 {
10 dataGridViewX1.ReadOnly = false;
11 }
12 saveBtn.Enabled = true;
13 }
4.保存操作,真正就改變的數據同步到數據庫中去,重要功能實現:
1 /// <summary>
2 /// 更新修改后的數據到數據庫中去
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void saveBtn_Click(object sender, EventArgs e)
7 {
8 int result = 0;
9 if (isChanged)
10 {
11 OracleConnection conn = new OracleConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
12 conn.Open();
13 // 創建一個 OracleTransaction 對象,然后調用 OracleConnection 對象
14 //的 BeginTransaction() 方法啟動事務。
15 OracleTransaction trans = conn.BeginTransaction();
16 // 創建一個 OracleCommand 對象,用于存儲 SQL 語句。
17 OracleCommand cmd = conn.CreateCommand();
18 cmd.Transaction = trans;
19 try
20 {
21 //如果有ID改變或刪除就級聯更新
22 if (bIdChange || bIdDel)
23 {
24 UpdateRelationTable(cmd);
25 }
26 result = da.Update(ds, tableName);
27 if (bIdChange || bIdDel)
28 {
29 trans.Commit();
30 }
31 }
32 catch (Exception ex)
33 {
34 //出現異常就回滾
35 if (bIdChange || bIdDel)
36 {
37 trans.Rollback();
38 }
39 MessageBox.Show(ex.Message);
40 }
41 finally
42 {
43 if (bIdChange || bIdDel)
44 {
45 newIdList.Clear();
46 oldIdList.Clear();
47 delIdList.Clear();
48 }
49 }
50 }
51 isChanged = false;
52 bIdDel = false;
53 bIdChange = false;
54 dataGridViewX1.ReadOnly = true;
55 dataGridViewX1.AllowUserToAddRows = false;
56 dataGridViewX1.AllowUserToDeleteRows = false;
57 saveBtn.Enabled = false;
58 //如果有數據行被更新到數據庫,會把具體的操作記錄到日志表中
59 if (result > 0)
60 {
61 //0表示普通表,1空間表
62 Node tn = DataManagerTree.FindNodeByText(selectedNodeText);
63 if (tn.Parent.Text != "屬性表")
64 {
65 LogHelp.writeUpdateDataLog(tableName, "1", "修改");
66 }
67 else
68 {
69 LogHelp.writeUpdateDataLog(tableName, "0", "修改");
70 }
71
72 LogHelp.writeLog(FrmMain.username, "更新通用數據",
73 "通用數據表" + tableName + "更新成功");
74 MessageBox.Show("更新數據庫成功");
75 }
76 else
77 {
78 LogHelp.writeLog(FrmMain.username, "更新通用數據",
79 "通用數據表" + tableName + "更新失敗");
80 MessageBox.Show("數據庫沒有更新");
81 }
82 }
這個函數功能相對復雜,因為涉及到級聯更新操作,不是使用的觸發器功能,因為不能使用觸發器,他們的關聯情況是根據ID字段部分內容進行關聯的,可能是前幾位不等。所以實現這個功能就相對復雜,我采用的方式是對這些關聯關系我通過一張數據表來維護,通過這張數據表就很輕松查出有關聯關系的表的所有內容,根據這些內容就可以做到級聯更新了,不過級聯更新都是采用的事務操作來保證數據的一致性,級聯更新在單獨一個函數中實現,函數代碼如下:
1 /// <summary>
2 /// 更新于相關的表
3 /// </summary>
4 /// <param name="cmd">帶事務的命令</param>
5 private void UpdateRelationTable(OracleCommand cmd)
6 {
7 //處理有ID改變的情況
8 SqlHelper sh = new SqlHelper();
9 string sql = string.Empty;
10 if (bIdChange)
11 {
12 //更新相關的表
13 for (int i = 0; i < oldIdList.Count; ++i )
14 {
15 //1.查詢數據字典找到所有需要更新的表
16 //string strTable = tableName.Substring(tableName.IndexOf('.')+1);
17 sql = "select second,bits from jcsjk_relation where first='"
18 + tableName + "'";
19 OracleDataReader odr = sh.ReturnDataReader(sql);
20 while (odr.Read())
21 {
22 //得到ID關聯的位數
23 int bits = int.Parse(odr[1].ToString());
24 //得到完整的表名稱,包括表的擁有者
25 string strTemp = odr[0].ToString();
26 //得到被改變的ID的前bits位
27 string strOldId = oldIdList[i].ToString().Substring(0, bits);
28 //查詢需要更新的相關ID
29 string strAll = odr[0].ToString();
30 sql = "select id from " + strAll + " where id like '" + strOldId + "%'";
31 OracleDataReader odr1 = sh.ReturnDataReader(sql);
32 while (odr1.Read())
33 {
34 //根據前bits位構建新的ID
35 string strNewId = newIdList[i].ToString().Substring(0, bits);
36 strNewId += odr1[0].ToString().Substring(bits);
37 //根據查詢出來的舊ID更新ID
38 sql = "update " + strTemp + " set id='" + strNewId
39 + "' where id ='" + odr1[0].ToString() + "'";
40 cmd.CommandText = sql;
41 cmd.ExecuteNonQuery();
42 }
43 }
44 }
45 }
46 //處理有ID刪除的情況
47 if (bIdDel)
48 {
49 foreach (string str in delIdList)
50 {
51 //查詢和刪除ID相關的表并執行事務刪除
52 //string strTable = tableName.Substring(tableName.IndexOf('.') + 1);
53 sql = "select second,bits from jcsjk_relation where first='"
54 + tableName + "'";
55 OracleDataReader odr = sh.ReturnDataReader(sql);
56 while (odr.Read())
57 {
58 string strTemp = odr[0].ToString();
59 string strOldId = str.Substring(0, int.Parse(odr[1].ToString()));
60 sql = "delete from " + strTemp + " where id like '" + strOldId + "%'";
61 cmd.CommandText = sql;
62 cmd.ExecuteNonQuery();
63 }
64 }
65 }
66 }
保存按鈕事件的功能除了同步改變的數據到數據庫以外,還會對具體的操作記錄日志并寫入數據庫日志表中,這個日志主要用于多臺數據庫服務器的同步操作。
5.綁定數據的控件數據單元的值發生變化產生時的響應函數代碼如下:
1 /// <summary>
2 /// 如果ID這一列的值有改變就保存改變后的值,原來的值在開始編輯事件中保存,如果值沒有改變,將在編輯結束
3 /// 刪除掉保存的原理的ID值,以保證原來的ID值與改變后的ID值一一對應,方便級聯更新和刪除
4 /// </summary>
5 /// <param name="sender"></param>
6 /// <param name="e"></param>
7 private void dataGridViewX1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
8 {
9 if (dataGridViewX1.Columns[e.ColumnIndex].HeaderText == "ID")
10 {
11 if (selectedNodeText == "DZYJ_JCSJK.city_code" || selectedNodeText == "DZYJ_JCSJK.county_code"
12 || selectedNodeText == "DZYJ_JCSJK.town_code" || selectedNodeText == "DZYJ_JCSJK.village_code"
13 || selectedNodeText == "DZYJ_JCSJK.enterprise_code")
14 {
15 bIdChange = true;
16 //保存新ID
17 newIdList.Add(dataGridViewX1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
18 bCellValueChange = true;
19 }
20 }
21 isChanged = true;
22 saveBtn.Enabled = true;
23 }
6.當用戶在輸入數據非法是執行如下函數;
1 /// <summary>
2 /// 提示用戶錄入數據非法
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void dataGridViewX1_DataError(object sender, DataGridViewDataErrorEventArgs e)
7 {
8 labelX6.Text = "數據錄入格式不正確";
9 }
7.導出數據到excel或word:
1 /// <summary>
2 /// 導出數據到excel和word
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void exportBtn_Click(object sender, EventArgs e)
7 {
8 //選擇導出的類型,excel或word
9 FrmSelectExpType fset = new FrmSelectExpType();
10 fset.ShowDialog();
11
12 if (fset.isGon)
13 {
14 //根據選擇的類型執行相應的導出功能
15 if (fset.type == 0)
16 {
17 //調用通用工具類的靜態函數導出為word
18 CommonTools.ExportDataGridViewToWord(dataGridViewX1);
19 }
20 else
21 {
22 ////調用通用工具類的靜態函數導出為word
23 CommonTools.DataToExcel(dataGridViewX1);
24 MessageBox.Show("導出數據完成!");
25 }
26 }
27 }
8.滾動顯示數據表的所有數據:
1 /// <summary>
2 /// 顯示所有的數據,可以滾動
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void showAllBtn_Click(object sender, EventArgs e)
7 {
8 dataGridViewX1.ScrollBars = ScrollBars.Both;
9 try
10 {
11 dataGridViewX1.FirstDisplayedScrollingRowIndex = 0;
12 }
13 catch (ArgumentOutOfRangeException)
14 {
15
16 }
17 }
9.分頁顯示函數功能:
1 /// <summary>
2 /// 分頁就是通過設置第一個顯示的行來實現
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void comboBoxEx1_SelectedValueChanged(object sender, EventArgs e)
7 {
8 try
9 {
10 dataGridViewX1.FirstDisplayedScrollingRowIndex = comboBoxEx1.SelectedIndex * 10;
11 }
12 catch (ArgumentOutOfRangeException)
13 {
14
15 }
16 }
10.導入excel的數據到控件中(DataGridView控件):
1 /// <summary>
2 /// 導入一個選擇的excel文件到DataGridView中
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void importBtn_Click(object sender, EventArgs e)
7 {
8 //打開一個文件選擇框
9 OpenFileDialog ofd = new OpenFileDialog();
10 ofd.Title = "Excel文件";
11 ofd.FileName = "";
12 //為了獲取特定的系統文件夾,可以使用System.Environment類的靜態方法GetFolderPath()。
13 //該方法接受一個Environment.SpecialFolder枚舉,其中可以定義要返回路徑的哪個系統目錄
14 ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
15 ofd.Filter = "Excel文件(*.xls)|*.xls";
16
17 //文件有效性驗證ValidateNames,驗證用戶輸入是否是一個有效的Windows文件名
18 ofd.ValidateNames = true;
19 ofd.CheckFileExists = true; //驗證路徑有效性
20 ofd.CheckPathExists = true; //驗證文件有效性
21 if (ofd.ShowDialog() == DialogResult.Cancel)
22 {
23 return;
24 }
25
26 if (ofd.FileName == "")
27 {
28 MessageBox.Show("沒有選擇Excel文件!無法進行數據導入");
29 return;
30 }
31 //調用導入數據方法
32 CommonTools.EcxelToDataGridView(ofd.FileName, dataGridViewX1);
33 MessageBox.Show("導入數據完成!");
34 }
11.瀏覽地圖功能實現:
1 /// <summary>
2 /// 瀏覽地圖
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void mapBrowseBtn_Click(object sender, EventArgs e)
7 {
8 Node tn = DataManagerTree.FindNodeByText(selectedNodeText);
9
10 string tabName = "地圖瀏覽";
11 if (!((FrmMain)this.MdiParent).IsOpenTab(tabName))
12 {
13 fsl = new FrmShowLayer();
14
15 fsl.MdiParent = MdiParent;
16 fsl.WindowState = FormWindowState.Maximized;
17 this.WindowState = FormWindowState.Normal;
18 fsl.Show();
19
20 }
21 /*
22 if (fsl == null)
23 {
24 fsl = new FrmShowLayer();
25 }
26 fsl.WindowState = FormWindowState.Maximized;
27 fsl.Show();*/
28 if (tn.Parent.Text != "屬性表")
29 {
30 fsl.AddLayerToMapCtl(tn.Text.ToUpper(), true);
31 }
32 }
12.樹形節點選中時功能的處理,不同節點有不同的處理方式(同一層是同樣的功能,只是處理的數據不同而已):
1 /// <summary>
2 /// 選中一個樹節點的時候對應不同層次做不同處理,可以顯示選中的數據集,
3 /// 選中一個表就在DataGridView中顯示表的數據
4 /// </summary>
5 /// <param name="sender"></param>
6 /// <param name="e"></param>
7 private void DataManagerTree_AfterNodeSelect(object sender, AdvTreeNodeEventArgs e)
8 {
9 //DataGridView中沒有數據時禁止導入導出和瀏覽地圖功能
10 mapBrowseBtn.Enabled = false;
11 importBtn.Enabled = false;
12 exportBtn.Enabled = false;
13 addBtn.Enabled = false;
14 modifyBtn.Enabled = false;
15 deleteBtn.Enabled = false;
16 showAllBtn.Enabled = false;
17
18 Node tn = new Node();
19
20 tn = e.Node;
21 selectedNodeText = tn.Text;
22
23 switch (tn.Level)
24 {
25 case 1:
26 labelX3.Text = tn.Text;
27 break;
28 case 2:
29 //使能功能按鈕
30 addBtn.Enabled = true;
31 modifyBtn.Enabled = true;
32 deleteBtn.Enabled = true;
33 showAllBtn.Enabled = true;
34 isChanged = false;
35 bIdDel = false;
36 bIdChange = false;
37 dataGridViewX1.ReadOnly = true;
38 dataGridViewX1.AllowUserToAddRows = false;
39 dataGridViewX1.AllowUserToDeleteRows = false;
40
41 delIdList.Clear();
42 newIdList.Clear();
43 oldIdList.Clear();
44
45 labelX3.Text = e.Node.Parent.Text;
46 labelX4.Text = "";
47 labelX4.Text = "當前數據表: " + tn.Text;
48
49 SqlHelper sh = new SqlHelper();
50
51 string[] first = tn.Text.Split('.');
52 string sql = "select column_name,data_type from all_tab_columns where table_name='"
53 + first[1].ToUpper() + "' and owner='" + first[0].ToUpper() + "'";
54
55 if (sh.GetRecordCount(sql) <= 0)
56 {
57 MessageBox.Show("數據表不存在!");
58 return;
59 }
60 tableName = tn.Text;
61 OracleDataReader odr = sh.ReturnDataReader(sql);
62 //動態構建顯示的sql語句,填充的字段
63 sql = "select ";
64 while (odr.Read())
65 {
66 //當DataGridView中有數據時就可以導入導出了
67 importBtn.Enabled = true;
68 exportBtn.Enabled = true;
69
70 if (odr[0].ToString() == "SHAPE")
71 {
72 //當DataGridView中有空間數據時就可以瀏覽地圖了
73 mapBrowseBtn.Enabled = true;
74 //DataGridView不能顯示Shape字段
75 continue;
76 }
77 //如果數據類型是BLOB就不加載
78 if (odr[1].ToString() == "BLOB")
79 {
80 continue;
81 }
82 sql += odr[0].ToString() + ",";
83 }
84 //移除最后一個逗號
85 sql = sql.Remove(sql.LastIndexOf(','));
86 sql += " from " + tableName;
87
88 if (Connection.State != ConnectionState.Open)
89 {
90 Connection.Open();
91 }
92 //構建數據適配器為了修改數據,綁定的數據表必須有主鍵才能修改
93 da = new OracleDataAdapter(sql, Connection);
94 builder = new OracleCommandBuilder(da);
95 ds = new DataSet();
96
97 try
98 {
99 da.Fill(ds, tableName);
100 dataGridViewX1.DataSource = null;
101 dataGridViewX1.DataSource = ds.Tables[0];
102 }
103 catch (System.Exception ex)
104 {
105 MessageBox.Show(ex.Message);
106 }
107
108 //以下是實現分頁顯示
109 int intMod, dgr;
110 //先讓垂直滾動條消失
111 dataGridViewX1.ScrollBars = ScrollBars.Horizontal;
112 //取出DGV的行數,為什么要減一是因為它總是多出一行給你編輯的所以那行也占用一行的空間
113 dgr = dataGridViewX1.RowCount - 1;
114 //進行取模
115 if (dgr % 10 == 0)
116 {
117 intMod = 0;
118 }
119 else
120 {
121 intMod = 1;
122 }
123 //主要時這個for循環將表一共分為幾頁添加到comboBox
124 comboBoxEx1.Items.Clear();
125 for (int i = 1; i <= dgr / 10 + intMod; i++)
126 {
127 comboBoxEx1.Items.Add("第" + i + "頁");
128 }
129 //默認選中第一個
130 if (comboBoxEx1.Items.Count > 0)
131 {
132 comboBoxEx1.SelectedIndex = 0;
133 }
134 break;
135 default:
136 break;
137 }
138 }
13.樹形節點被展開時執行的相應功能實現如下:
1 /// <summary>
2 /// 節點展開以后顯示下層節點
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void DataManagerTree_AfterExpand(object sender, AdvTreeNodeEventArgs e)
7 {
8 Node tn = e.Node;
9 string sql;
10 SqlHelper sh = new SqlHelper();
11 OracleDataReader odr;
12
13 switch (tn.Level)
14 {
15 case 0:
16 tn.Nodes.Clear();
17 sql = "select name from jcsjk_element where category='矢量數據'";
18 odr = sh.ReturnDataReader(sql);
19
20 while (odr.Read())
21 {
22 Node t = new Node();
23 t.Text = odr[0].ToString();
24 tn.Nodes.Add(t);
25 t.Nodes.Add(new Node());
26 }
27 break;
28 case 1:
29 tn.Nodes.Clear();
30 sql = "select table_name from jcsjk_layer l,jcsjk_element e where l.pid=e.id and e.name = '"
31 + tn.Text + "' and e.category='矢量數據'";
32 odr = sh.ReturnDataReader(sql);
33
34 while (odr.Read())
35 {
36 Node t = new Node();
37 t.Text = odr[0].ToString();
38
39 tn.Nodes.Add(t);
40 }
41 break;
42 default:
43 break;
44 }
45 }
14.開始編輯控件數據的時候執行的函數功能實現如下:
1 /// <summary>
2 /// 開始編輯事件,如果編輯的是ID列就保存原來的ID
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void dataGridViewX1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
7 {
8 if (dataGridViewX1.Columns[e.ColumnIndex].HeaderText == "ID")
9 {
10 if (selectedNodeText == "DZYJ_JCSJK.city_code" || selectedNodeText == "DZYJ_JCSJK.county_code"
11 || selectedNodeText == "DZYJ_JCSJK.town_code" ||
12 selectedNodeText == "DZYJ_JCSJK.village_code" || selectedNodeText == "DZYJ_JCSJK.enterprise_code")
13 {
14 if (oldIdList == null)
15 {
16 oldIdList = new ArrayList();
17 }
18 //保存舊ID
19 if (dataGridViewX1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() != "")
20 {
21 oldIdList.Add(dataGridViewX1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
22 }
23 }
24 }
25 }
15.結束編輯控件數據的時候執行的函數功能實現如下:
/// <summary>
/// 編輯結束事件,如果ID值沒有改變就刪除原來保存的
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridViewX1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (bCellValueChange)
{
bCellValueChange = false;
}
else
{
if (dataGridViewX1.Columns[e.ColumnIndex].HeaderText == "ID")
{
if (selectedNodeText == "DZYJ_JCSJK.city_code" || selectedNodeText == "DZYJ_JCSJK.county_code"
|| selectedNodeText == "DZYJ_JCSJK.town_code" ||
selectedNodeText == "DZYJ_JCSJK.village_code" || selectedNodeText == "DZYJ_JCSJK.enterprise_code")
{
if (dataGridViewX1.Rows[e.RowIndex].Cells[e.ColumnIndex] != null)
{
oldIdList.Remove(dataGridViewX1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
}
}
}
}
}
到此整個同樣數據管理模塊的功能已經實現,這里需要強調一點的是,當在判斷對于的屬性數據是否對應有相應的空間數據時就是判斷對于的表結構是否有“Shape”字段,空間數據里面還涉及到很多概念以后在介紹管理空間數據時會詳細介紹。還有一點就是上面實現圖層的可視化顯示(地圖)后面會詳細介紹,至于word和excel的導入導出功能是在一個通過用的工具類中實現,以方便整個程序中都可以使用,日志的寫入也是專門的日志幫助類實現。
浙公網安備 33010602011771號