=========================ConTextMenuStrip右鍵菜單=========================
右鍵菜單的東西無需多說,有一個比較實用的技巧是根據不同的情況來決定快顯功能表的內容.比如在列表中選中了一項,則顯示添加,刪除.沒選中,則只顯示添加.
contextMenuStrip1.Items["按鈕名"].Visible,通過此屬性來設定隱藏或者顯示
=========================SaveFileDialog/OpenFileDialog======================
就是開啟一個儲存/開啟對話方塊,這個很常見.比如你另存新檔時,或者下載時.簡單介紹一下相關屬性
saveFileDialog1.FileName 擷取或設定選定檔案字串:
擷取:也就是按下了儲存鍵後,將返回選中檔案的絕對路徑. string path=saveFileDialog1.FileName
設定:開啟對話方塊時,儲存的預設檔案名稱. saveFileDialog1.FileName="請輸入儲存名"
saveFileDialog1.Filter 開啟儲存對話方塊後,設定檔案類型和預設尾碼名
saveFileDialog1.Filter="壓縮檔|.rar"
saveFileDialog1.InitialDirectory開啟對話方塊時的預設路徑.
saveFileDialog1.InitialDirectory="D://Download"那麼這次開啟對話方塊就會直接開啟D盤的Download檔案夾了
============================ListBox====================================
ListBox擷取滑鼠指向的行號:必須寫在滑鼠事件裡
int Index = listBox2.IndexFromPoint(e.Location);
大量刪除:
大量刪除原理:由於刪掉一行後,刪除行下面的每個Item的行號都會減1。所以從上刪到下是非常麻煩的。我們可以從下往上刪。
假設刪除行的行號的index,一直刪除直到碰到“停止刪除”這一項為止。
Index= listBox2.IndexFromPoint(e.Location); //即滑鼠選中那行的行號
for (int i = Index-1; i >= 0; i--)
{
if (i == 0)
{
listBox2.Items.RemoveAt(i);//如果刪到了最頂行,先刪除第i行,也就是選中行的上一行
listBox2.Items.RemoveAt(i);//然後選中行已經變成第0行,再刪一次,刪除選中行
}
else if (listBox2.Items[i].toString()=="停止刪除")
{
listBox2.Items.RemoveAt(i+1);//碰到停止刪除,此時滑鼠點擊行已經位於“停止刪除”行的下方,所以刪除上一項時間行+1就行了
break;
}
else
{
listBox2.Items.RemoveAt(i);//否則就刪除資料
}
}
============================DataGridView====================================
DataGridView選中一行並且置頂:
dataGridView1.Rows[i].Selected = true;
dataGridView1.FirstDisplayedScrollingRowIndex = i;
去掉標題列
RowHeadersVisible設為false
去掉自動增加的空行
AllowUserToAddRows設為false
一次選中一行
DataGridView.Rows[DataGridView.SelectedCells[0].RowIndex].Selected = true;
或者在屬性中的SelectionMode中設定為fullRowSelect
清除所有選中行
dgvSroleinfo.ClearSelection();
刪除選中行 DataGridView.Rows.RemoveAt(行號) ( 擷取選中行的行號可參考一次選中一行的代碼)右鍵選中:DataGridView.Rows[e.RowIndex].Selected = true;//右鍵選中
游標
cursor
============================Listview====================================
Listview控制項可以理解為一個功能複雜的ListBox.每一項都是一個ListViewItem,這個節點擁有一個name屬性,一個text屬性,一個Tag屬性.Tag是Object類型的,可以指向任何一個對象.每個節點都可以包含一個圖片. 不像ListBox的項,一般都是一個簡單的String.
Listview的每在StateImageList屬性裡,綁定一個ImageList
給節點綁定圖片:
先把圖片放在一個ImageList裡面,讓Listview控制項的StateImageList屬性綁定這個ImageList
定義節點,加入到控制項裡:
既然每一項都是一個節點,那麼加入的時候自然要先初始化節點了:
ListViewItem newItem;//定義節點
newItem = new ListViewItem();//初始化節點
newItem.Name = "節點名字";
newItem.Text = "節點在控制項上顯示的內容";//節點文本為角色名稱字
newItem.Tag = "綁定一個任意類型的變數,也可以是對象"
newItem.ImageIndex = 0;//綁定圖片
Listview1.Items.Add(newItem);//載入到控制項裡
然後在外面套個迴圈,就可以把所有節點都載入上去了.
額外常用的屬性:
HideSelection失去焦點時,取消選中項的反白.
範例程式碼:
private void LoadRoleName()<br /> {<br /> ltvRoleno.Clear();//先清空ltvRoleno的所有項<br /> try<br /> {<br /> List<CommonModel.SRoleInfo> MD_SRoleInfos = BLL_sroleinfo.GetModelList("");//這個在別的地方實現的,你不用管,總之擷取到一個MD_SRoleInfos(角色資訊的對象集合).包含N個角色資訊對象.每個角色資訊對象都有roleNo,roleName,remark這3個string型的屬性<br /> ltvRoleno.SmallImageList = imageList1;//綁定圖片集合<br /> ListViewItem newItem;//定義節點<br /> for (int i = 0; i < MD_SRoleInfos.Count; i++)<br /> {<br /> newItem = new ListViewItem();<br /> newItem.Name = MD_SRoleInfos[i].roleNo;//節點名字為角色ID<br /> newItem.Text = MD_SRoleInfos[i].roleName;//節點文本為角色名稱字<br /> newItem.Tag = MD_SRoleInfos[i].remark;//節點標記為角色描述<br /> newItem.ImageIndex = 0;//綁定圖片<br /> ltvRoleno.Items.Add(newItem);//載入到控制項裡<br /> }<br /> }<br /> catch (Exception ex)<br /> {<br /> ShowMessage(ex.Message);<br /> }<br /> }
============================TreeView====================================
廢話部分:樹形結構是很常用的一個控制項.最難弄的是它的載入和讀取都要用到遞迴.但是遞迴其實很簡單,就是方法自己引用自己.網上有很多介紹用遞迴載入樹控制項的,仔細看都不難.我是瞌睡的時候悟出來的,然後把思路寫在了本子上,第二天回公司實現了這個方法.由此可見它有多簡單.
額外的雜項:樹形控制項的每一個節點,也都包含有name,text,tag屬性.也是非常強悍的一個節點.用TreeNode node=new TreeNode()來初始化.
實現思路:因為樹形控制項的每一個節點,都可能包含子節點.思路就是:
我們每加入一個節點,都要自動找到它的子節點,然後加入到這個節點下面..
那麼怎麼找到某個的節點的子節點呢?對於子節點來說,它們需要的就是父節點的相關資訊.所以只要把節點本身作為參數傳進去,就不怕找不到它的子節點.
也就是說,這個方法應該是這樣:
private void GetTreeView(TreeNode fatherNode)
{
//先根據參數fatherNode找到它子節點的相關資訊.怎麼找呢?比如在資料庫,可以載入為樹形的資料每一行自然一定會包含它父行的ID...如果你是把ID存在樹形節點的name屬性中,那麼就可以用fatherNode.name擷取到ID啦.
for(int i=0;i<結果數量;i++)
{
TreeNode newnode = new TreeNode();//初始化一個節點
newnode.Name="節點名";
newnode.Text ="節點顯示內容";
newnode.tag="節點綁定的對象";
if (fatherNode == null)
{
treeView1.Nodes.Add(newnode);//如果父節點為空白,那麼是頂層節點,應該加在控制項上
}
else
{
fatherNode.Nodes.Add(newnode);//父節點不為空白,那麼就加在父節點下面.
}
}
}
好的,現在我們隨便拿一個節點來,就可以擷取,並載入它所有的子節點了.
現在知道遞迴的朋友應該已經知道,在哪裡添加遞迴了吧!不知道的話,繼續看下去
剛才的方法,作用就是我們隨便拿一個節點,就可以載入它的所有的兒子.
但是兒子下面可能還有兒子的.我們隨便拿的一個節點,它可能是某個節點的父親,同時也可能是某個節點的爺爺...所以光找出它所有的兒子是不夠的.
那麼其實很簡單,當我們找到一個兒子後,就用這個方法,把兒子做參數傳進去,再去找兒子的所有兒子.
方法就變成了:
private void GetTreeView(TreeNode fatherNode)
{
//先根據參數fatherNode找到它子節點的相關資訊.怎麼找呢?比如在資料庫,可以載入為樹形的資料每一行自然一定會包含它父行的ID...如果你是把ID存在樹形節點的name屬性中,那麼就可以用fatherNode.name擷取到ID啦.
for(int i=0;i<結果數量;i++)
{
TreeNode newnode = new TreeNode();//初始化一個節點
newnode.Name="節點名";
newnode.Text ="節點顯示內容";
newnode.tag="節點綁定的對象";
if (fatherNode == null)
{
treeView1.Nodes.Add(newnode);//如果父節點為空白,那麼是頂層節點,應該加在控制項上
}
else
{
fatherNode.Nodes.Add(newnode);//父節點不為空白,那麼就加在父節點下面.
}
GetTreeView(newnode );//把兒子的兒子再找出來.
}
}
那麼這個方法就變成了:我們隨便拿一個節點,就可以載入它的所有的兒子.每載入一個兒子,就會再次用這個方法,再載入兒子所有的兒子....一直載入下去,直到找不到兒子為止.這就是遞迴,自己用自己.
在資料庫載入時怎麼最佳化:
可以看到這個方法,每次都會去找它的兒子.那麼如果我們每次遞迴都要根據父節點的某個屬性,去資料庫尋找它的子節點.就會串連很多次資料庫.最好的辦法是先把整張關係表都載入進來,然後在表裡面找.
範例程式碼:
/// <summary><br /> /// 用遞迴方式產生樹狀結構.已經最佳化.<br /> /// </summary><br /> /// <param name="fatherNode">第一次使用NULL</param><br /> /// <param name="dt">所有查詢結果</param><br /> private void GetTreeView(TreeNode fatherNode,DataTable dt)<br /> {<br /> DataView dtview = new DataView(dt);//這是用來刪選DataTable的好工具<br /> if(fatherNode==null)<br /> {<br /> dtview.RowFilter = "fatherNo=0";//如果父節點為空白,那麼刪選出頂層節點.我的資料庫結構,fatherNo=0的行,都表示頂層節點.<br /> }else<br /> {<br /> dtview.RowFilter = string.Format("fatherNo= {0}",fatherNode.name);//刪選出所有父id為fatherNode.name的節點.因為ID存在Name裡<br /> }<br /> foreach (DataRowView row in dtview)<br /> {<br /> TreeNode newnode = new TreeNode();<br /> newnode.Name=row["No"].ToString();<br /> newnode.Text = row["Name"].ToString();<br /> if (fatherNode == null)<br /> {<br /> treeView1.Nodes.Add(newnode);<br /> }<br /> else<br /> {<br /> fatherNode.Nodes.Add(newnode);<br /> }</p><p> GetTreeView(newnode,dt);<br /> }<br /> }
同樣,遍曆樹也是一樣的道理,要用遞迴:
private void Read(TreeNode fatherNode)<br /> {<br /> if (fatherNode == null)<br /> {<br /> fatherNode.Nodes=treeView1.Nodes;//如果父節點為空白,要遍曆的就是頂層節點.<br /> }<br /> foreach (TreeNode node in fatherNode.Nodes)<br /> {<br /> string No=node.name<br /> string Name=node.text<br /> Read(node);//繼續遞迴<br /> }<br /> }
====================================DataView======================================
DataView允許在已經載入到記憶體裡的Datatable裡執行二次操作.結果返回一個新的Datatable
初始化一個DataView:
DataView DV=new DataView(Datatable);
使用DataView的刪選方法:
DV.RowFilter="刪選條件的寫法,和SQL語句where段的寫法一樣"
DV就相當於一個刪選後的Datatable.
==============================DataRowView==================================
DataRowView一般都來表示Datatable的一行..使遍曆整個Datatable變得很簡單
foreach(DataRowView DRV in Datatable)
{
DRV ["列名"]
}