国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
GridView內(nèi)容詳解(2)
三、命令列的使用
   命令列主要提供了GridView中常用的一些修改、更新、刪除的操作,在GridView與DataSource控件結(jié)合使用的情況下,我們并不需要為些編寫太多的代碼就可以實現(xiàn)簡單的維護操作,如果在復雜的情況下(如一對多鏈接查詢時),我們?nèi)孕枰帉懘a來實現(xiàn)更新與刪除。(車延祿)
    
 

   使用命令列有兩種方式:
       1.在“可選列”中添加相應的CommandField列的子項
       2.在“可選列”中添加CommandField列,然后設置CommandField列的屬性ShowEditButton、ShowDeleteButton等
   一旦添加了命令按鈕,我們就可以對GridView實現(xiàn)簡單的修改和更新的操作了。但是如果要想實現(xiàn)刪除操作的話還不行,還需要為GridView設置一個DataKeyNames屬性。如果不設置此屬性的話編譯是沒問題的,但運行時會產(chǎn)生“未提供參數(shù)”的異常,這一點切記。
    

 

   DataKeyNames屬性用來設置GridView對應的數(shù)據(jù)源的主鍵列,只有設置這個屬性,在刪除的時候才會把要刪除的主鍵值傳遞給DataSource控件執(zhí)行刪除功能。
       

 

   我們一起來看一下運行結(jié)果所存在的問題:
       1.主鍵列Code不應當被編輯
       2.GridView自動產(chǎn)生的文本框太寬,把我們的GridView都給擠變形了。
       3.民族列在瀏覽時一直都顯示民族代號,應當顯示民族名稱
       4.民族列在修改的時候最好使用下拉列表讓用戶選擇相應的民族。
       5.文本輸入框沒有任何驗證,對輸錯的信息在提交的時候會產(chǎn)生異常
       6.刪除時沒有確認提示
       7.刪除時產(chǎn)生外鍵引用的異常
   這里的問題實在是太多了,有的問題很簡單就可以解決,但有的問題我們借助后面的模板列會更簡單一些。
    1、防止某列被編輯,只需要在“編輯列”對應框中將該列的ReadOnly屬性設為true就可以了。
   2、代碼控制編輯狀態(tài)下文本框的寬度(這種方式有點復雜,可以用模板列實現(xiàn))
       我們上面已經(jīng)分析過GridView每一行的建造過程了,它包含“創(chuàng)建行”和“綁定行”兩步操作,“創(chuàng)建行”的過程中會把一些靜態(tài)的東西創(chuàng)建出來,當然也包含文本框的創(chuàng)建。因此我們只需要在RowCreated事件中把編輯列中的文本框的長度改變一下就可以了。
       protected void GridView1_RowCreated(objectsender, GridViewRowEventArgs e)
       {
           if (e.Row.RowType == DataControlRowType.DataRow)
           {
               //這里可能是VS2005的一個Bug,所以我只好把整型強制轉(zhuǎn)為DataControlRowState枚舉類型再與e.Row.RowState屬性進行比較
               //4-Normal行的編輯狀態(tài),5-Alternating行處于編輯狀態(tài)
               if (e.Row.RowState ==(DataControlRowState)4||e.Row.RowState==(DataControlRowState)5)
               {
                   //Width屬性是Unit類型,不能直接賦整型值
                   //Unit.Pixel():按像素設置絕對寬度;Unit.Percent():按百分比設置寬度
                   ((TextBox)e.Row.Cells[1].Controls[0]).Width =Unit.Pixel(60);  
                   ((TextBox)e.Row.Cells[3].Controls[0]).Width = Unit.Pixel(60);
                   ((TextBox)e.Row.Cells[4].Controls[0]).Width =Unit.Pixel(100);
               }
           }
       }
        

 

   3.瀏覽狀態(tài)時顯示民族名稱,只需要將實體中添加一個只讀屬性NationName,然后用它替換Nation字段,綁定到GridView就可以了。
   4.對主表中的數(shù)據(jù)刪除時級聯(lián)刪除相關子表數(shù)據(jù)
       這種問題用很多種實現(xiàn)方式:
           a.使用數(shù)據(jù)庫中外鍵的級聯(lián)刪除功能
           b.使用存儲過程或觸發(fā)器。
           c.在程序代碼中刪除
       前兩種方式實現(xiàn)方式主要是數(shù)據(jù)庫方面的知識,這里不多說了,下面我們主要看看如何使用程序代碼刪除數(shù)據(jù)。
       當我們點擊刪除按鈕的時候,GridView會自動把要刪除的行對象傳遞給DataSource控件,然后DataSource調(diào)用相關的業(yè)務類的方法執(zhí)行刪除,再然后就發(fā)生“外鍵引用異常”......
       整個這個過程是系統(tǒng)自動完成的,那我們要想自己寫代碼進行級聯(lián)刪除,并且禁止系統(tǒng)自動調(diào)用默認的刪除功能,那如何實現(xiàn)呢?
        
        

 


       大家會注意到其中的事件大部分都有兩類:***ed和***ing兩類。如:Deleted和Deleting事件
       ***ed事件:系統(tǒng)執(zhí)先完操作后觸發(fā),如Deleted事件是系統(tǒng)調(diào)用默認刪除功能,刪除成功后自動觸發(fā)
       ***ing事件:系統(tǒng)執(zhí)行操作之前觸發(fā),如Deleting事件是系統(tǒng)調(diào)用默認刪除功能之前觸發(fā)。
       現(xiàn)在大家應當清楚在點擊刪除按鈕后如何添加自己的刪除處理程序了,答案當然是應當在Deleting中編寫代碼進行級聯(lián)刪除。
       主要代碼如下:
       protected void GridView1_RowDeleting(object sender,GridViewDeleteEventArgs e)
       {
           //取得要刪除行的主鍵的值
           string str =GridView1.DataKeys[e.RowIndex].Value.ToString();
           //使用事務
           using (TransactionScope ts = newTransactionScope())
           {
               //刪除該主鍵值在刪除簡歷表中對應的數(shù)據(jù)
               new WorkDA().deleteInfo(str);
               //刪除該主鍵值在刪除家庭關系表中對應的數(shù)據(jù)
               new FamilyDA().deleteInfo(str);
               //刪除該主鍵值在基本信息表中對應的數(shù)據(jù)
               new InfoDA().delete(str);
               //提交事務
               ts.Complete();
           }
           //取銷事件進一步響影,即該刪除操作不再往上提交至DataSource控件。
           e.Cancel =true;
       }
   問題還沒全部解決,剩下的問題我們留給模板列來解決。(雖然不用模板列也可以解決上面所有的問題,但是那可需要大量的Coding,所以建議大家使用模板列)

 

四、模板列
   關于模板列我們可以用四個字來描述--“無所不能”。很多棘手的問題,在遇到模板列的時候會迎刃而解,因為模板列的定制功能很強大,允許我們建立不同狀態(tài)下的模板,所以我們用代碼控制起它來也就更加靈活自如了。(車延祿)
   創(chuàng)建模板列一般有兩種方式:
       在“編輯列”對話框中向“選中列”中添加TemplateField字段
       在“編輯列”對話框中點擊“選中列”中相應的列,再點擊“確定”按鈕上方的“將此字段轉(zhuǎn)換為TemplateField”文字,這就把現(xiàn)有的列轉(zhuǎn)換為模板列了。這種轉(zhuǎn)換方式大家要小心使用,因為一旦轉(zhuǎn)換為模板列,就沒辦法再轉(zhuǎn)換回去了。
    
    

 


當一個綁定列轉(zhuǎn)換為模板列后,該列的數(shù)據(jù)顯示時,會把數(shù)據(jù)源的數(shù)據(jù)綁定到模板列的Label控件中去。而不是像綁定列那樣直接把數(shù)據(jù)綁定到單元格的Text屬性上。
   所以取模板列的單元格中的值與取綁定列的單元格中的值是有區(qū)別的:
    protected voidGridView1_RowDataBound(object sender,GridViewRowEventArgs e)
    {
       if (e.Row.RowType == DataControlRowType.DataRow)
       {
           if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState== DataControlRowState.Alternate)
           {
               //在RowDataBound事件中操作綁定列的單元格中的顯示值
               e.Row.Cells[4].Text += "...";
               //在RowDataBound事件中操作模板列的單元格中的顯示值
               ((Label)e.Row.Cells[3].Controls[1]).Text="...";
           }
       }
   }
   在綁定列中,數(shù)據(jù)直接綁定在單元格的Text屬性上,所以可以直接用e.Row.Cells[4].Text進行操作;但在模板列中,數(shù)據(jù)并沒有綁定在單元格的Text上,而是綁定在Label控件的文本上,所以應當通過e.Row.Cells[3].Controls[1]來取得Label控件(要記得強制轉(zhuǎn)換)。細心的朋友會發(fā)現(xiàn)這里我是取“當前行第三個單元格中第一個控件”該控件就是顯示數(shù)據(jù)的Label控件,那為什么要取第一個控件而不是第“零”個控件呢?答案是,當GridView運行的時候會在模板列中綁定顯示數(shù)據(jù)的Label控件的前后分別加入一個Literal控件。
   
   下面我們繼續(xù)來解決未解決的問題:(車延祿)
   1.如何實現(xiàn)刪除時出現(xiàn)確認提示的功能:
       思路:把刪除按鈕所在的列轉(zhuǎn)換模板列,此時我們就會在“源頁面”中找到刪除按鈕了,然后在刪除按鈕里加入OnClientClick事件,執(zhí)行returnwindow.confirm('...')腳本函數(shù)。
       
        

 

   2.民族列在編輯狀態(tài)下顯示下拉列表
       第一步:把民族列變?yōu)槟0辶?br>       第二步:修改民族列的編輯模板,把原有的文本框刪除,加入下拉列表ddlNation和DataSource控件
       第三步:配置DataSource控件,訪問民族字典表。
       第四步:將ddlNation下拉列表綁定到DataSource控件上
       第五步:打開“源頁面”在ddlNation控件中加入屬性:SelectedValue=<%#Bind('Nation')%>,把下拉列表框的選中值設為當前行的民族值。
      
        

 

       大家思考:如何把性別列變?yōu)閱蜗劝粹o列表形式?
   3.在編輯狀態(tài)下加入驗證控件:
       把在編輯狀態(tài)下需要加入驗證控件的列全都轉(zhuǎn)換為模板列,然后在其編輯狀態(tài)模板上加入驗證控件,并設置其驗證相應的文本框即可。

   4.用模板列實現(xiàn)GridView的嵌套
       在GridView模板列的單元格中再加入GridView。這種形式將來有可能用到。
       運行效果:
       《圖23》
       這個例子使用了三個GridView進行嵌套,顯示出制造商、系列和汽車型號之間的關系。
       源代碼如下:
       <asp:GridViewID="GridView1" runat="server"
           CellPadding="0" DataKeyNames="Prod_code"DataSourceID="ObjectDataSource1"
           ForeColor="#333333" GridLines="Horizontal"onrowdatabound="GridView1_RowDataBound"
           Width="100%">
           <FooterStyle BackColor="#1C5E55" Font-Bold="True"ForeColor="White" />
           <RowStyle BackColor="#E3EAEB"HorizontalAlign="Center" />
           <Columns>
               <asp:BoundField DataField="Prod_name"HeaderText="生產(chǎn)廠商"
                   Sortexpression_r_r="Prod_name">
                   <HeaderStyle Width="100px" />
                   <ItemStyle BackColor="#99CCFF"/>
               </asp:BoundField>
               <asp:TemplateFieldHeaderText="汽車信息">
                   <ItemTemplate>
                       <asp:GridView ID="GridView2"runat="server"
                           CellPadding="0" ForeColor="#333333"
                           GridLines="Horizontal" ShowHeader="False" Width="100%"
                           DataKeyNames="Brand_Code"onrowdatabound="GridView2_RowDataBound">
                           <FooterStyle BackColor="#1C5E55" Font-Bold="True"ForeColor="White" />
                           <RowStyle BackColor="#E3EAEB" BorderStyle="Dotted"HorizontalAlign="Left" />
                           <Columns>
                               <asp:BoundField DataField="Brand_name"HeaderText="Brand_name"
                                   Sortexpression_r_r="Brand_name" >
                                   <HeaderStyle Width="100px" />
                                   <ItemStyle BackColor="#FFCC66" Width="100px"/>
                               </asp:BoundField>
                               <asp:TemplateField>
                                   <ItemTemplate>
(車延祿)
                                       <asp:GridView ID="GridView3"runat="server"
                                           CellPadding="0" ForeColor="#333333" GridLines="None"ShowHeader="False"
                                           Width="100%">
                                           <FooterStyle BackColor="#1C5E55" Font-Bold="True"ForeColor="White" />
                                           <RowStyle BackColor="#E3EAEB"/>
                                           <Columns>
                                               <asp:BoundFieldDataField="Name">
                                                   <ItemStyle BackColor="#CC99FF"HorizontalAlign="Left" Width="100%" />
                                               </asp:BoundField>
                                           </Columns>

                                        </asp:GridView>
                                   </ItemTemplate>
                               </asp:TemplateField>
                           </Columns>
                        </asp:GridView>
                   </ItemTemplate>
               </asp:TemplateField>
           </Columns>
            ......       </asp:GridView>
      
       后臺代碼如下:
       protected voidGridView1_RowDataBound(object sender,GridViewRowEventArgs e)
       {
           if (e.Row.RowType == DataControlRowType.DataRow)
           {
               if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState== DataControlRowState.Alternate)
               {
                   string prodCode =GridView1.DataKeys[e.Row.RowIndex].Value.ToString();
                   ObjectDataSource sdsBrand = new ObjectDataSource(); ;
                   sdsBrand.ID = "ObjectDataSource2";
                   sdsBrand.TypeName = "BrandDA";
                   sdsBrand.SelectMethod = "selectProd_code";
                   sdsBrand.SelectParameters.Add("prod_code", prodCode);
                   e.Row.Cells[1].Controls.Add(sdsBrand);
                   GridView gvBrand =(GridView)e.Row.Cells[1].FindControl("GridView2");
                   gvBrand.DataSourceID =sdsBrand.ID;
               }
           }
       }
       protected void GridView2_RowDataBound(object sender,GridViewRowEventArgs e)
       {
           if (e.Row.RowType == DataControlRowType.DataRow)
           {
               if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState== DataControlRowState.Alternate)
               {
                    GridViewgvBrand = e.Row.Parent.Parent as GridView;

                   string brandCode =gvBrand.DataKeys[e.Row.RowIndex].Value.ToString();
                   ObjectDataSource sdsCar = new ObjectDataSource(); ;
                   sdsCar.ID = "ObjectDataSource3";
                   sdsCar.TypeName = "CarDA";
                   sdsCar.SelectMethod = "selectBrand";
                   sdsCar.SelectParameters.Add("brand", brandCode);
                   e.Row.Cells[1].Controls.Add(sdsCar);
                   GridView gvCar =(GridView)e.Row.Cells[1].FindControl("GridView3");
                   gvCar.DataSourceID =sdsCar.ID;
               }
           }
       }
   
五、按鈕列   
       除了執(zhí)行“命令列”功能之外的其它功能按鈕,這些按鈕在點擊的時候都會觸發(fā)RowCommand事件。如果在GridView中有多個按鈕列,那這多個按鈕列的按鈕就都過來執(zhí)行RowCommand事件中的代碼,如何區(qū)分是哪個按鈕列的哪個按鈕被點擊是一個關鍵性的問題。(車延祿)
       區(qū)分不同列的按鈕:
           為區(qū)分不同類型的按鈕(即不同列的按鈕),我們在創(chuàng)建按鈕列的時候可以為按鈕列設置CommandName,這樣不同類型的按鈕就可以通過CommandName來區(qū)分了。
       區(qū)分不同行的按鈕:
           不同行的按鈕不用我們手動區(qū)分,系統(tǒng)會自動為我們區(qū)分,在RowCommand的事件參數(shù)GridViewCommandEventArgse中有一個屬性e.CommandArgument,它的值就是行的索引號。因此我們可以通過e.CommandArgument判斷是哪一行的按鈕被點擊了。
       我們既可以通過按鈕列的CommandName屬性來區(qū)分不同列的按鈕,又可以通過RowCommand事件的GridViewCommandEventArgs參數(shù)取得不同行的按鈕,那二者結(jié)合起來使用豈不可以隨意控制頁面中任何地方的按鈕了嗎?
       
       如:
       源代碼:
       <asp:GridView ID="GridView1"runat="server" DataSourceID="ObjectDataSource1"
           onrowcommand="GridView1_RowCommand"DataKeyNames="Ids">
           <FooterStyle BackColor="#1C5E55" Font-Bold="True"ForeColor="White" />
           <RowStyle BackColor="#E3EAEB"/>
           <Columns>
               ......
               <asp:ButtonFieldCommandName="cmdUP" Text="向上"/>
               <asp:ButtonFieldCommandName="cmdDN" Text="向下"/>
           </Columns>
           ......
       </asp:GridView>
       C#代碼:(車延祿)
       protected voidGridView1_RowCommand(object sender,GridViewCommandEventArgs e)
       {
           if (e.CommandName =="cmdUP")
           {
               string pk =GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Value.ToString();
               Response.Write("主鍵為" + pk + "行的向上按鈕被點擊了");
           }
           else if (e.CommandName =="cmdDN")
           {
               string pk =GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Value.ToString();
               Response.Write("主鍵為" + pk + "行的向下按鈕被點擊了");
           }
       }

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
GridView 特性總結(jié)
ASP.NET中GridView控件ButtonField的使用
gridview的事件大全
如何:響應 GridView 控件中的按鈕事件
GridView的RowDataBound事件獲取主鍵方法
給GridView中的buttonField添加一個刪除確認功能
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服