博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在asp.net2.0中,当我们需要在GridView的ItemDataBound之类的事件中需要获取当前行的一些关联性的数据值,但这些数据值又 不能直接体现在GridView的列中显示出来,这时我们可以采用DataKeyNames的方式来获取此类数据,看下面的代码示例:

前台代码:
        <asp:GridView ID="GridView1" runat="server" DataKeyNames="Grup" OnRowCommand="GridView1_RowCommand" AutoGenerateColumns="False">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%#Eval("GrupName") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:ButtonField Text="按钮" />
            </Columns>
        </asp:GridView>
其中:Grup为我们想使用但不需要显示的列。(如果有多个字段,使用逗号分开)

后台代码:
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack )
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Grup");
            dt.Columns.Add("GrupName");

            dt.Rows.Add(new object[] { 0,"营业部" });
            dt.Rows.Add(new object[] { 1,"市场部" });

            this.GridView1.DataSource = dt;
            this.GridView1.DataBind();
        }
    }

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        // 获取当前行索引
        int index = Convert.ToInt32(e.CommandArgument);

        // 取出当前行数据键值对象中的值
        string strGrup = ((GridView)sender).DataKeys[index].Values["Grup"].ToString()
    }

顺便补充一句。
如果你使用模板列中放置按钮控件的方式,要想在按钮事件中获取这种字段值就更简单了。

只需要在按钮的CommandArgument属性设置为想绑定的字段,如:

<asp:TemplateField>
     <ItemTemplate>
         <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Button" CommandArgument=' <%#Eval("Grup") %>' />
     </ItemTemplate>
</asp:TemplateField>

按钮事件中如是写:

protected void Button2_Click(object sender, EventArgs e)
{
    string strGrup = ((Button)sender).CommandArgument.ToString();
}

 


GridView控件给CommandArgument传递多个参数示例

 

 

GridView控件给CommandArgument传递多个参数示例,具体示例如下:

html代码
<asp:GridView ID="GVSecondType" runat="server" AutoGenerateColumns="False" Style="position: relative" Width="100%" CellPadding="4" BackColor="White" BorderColor="#3366CC" BorderStyle="None" BorderWidth="1px" AllowPaging="True" OnPageIndexChanging="GVSecondType_PageIndexChanging" OnRowCommand="GVSecondType_RowCommand">
        
<Columns>
            
<asp:TemplateField HeaderText="所属一级分类">
                
<EditItemTemplate>
                    
<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
                
</EditItemTemplate>
                
<ItemTemplate>
                    
<asp:Label ID="lblName" runat="server" Style="position: relative" Text='<%#Eval("Parent_TypeName1") %>'></asp:Label>
                
</ItemTemplate>
            
</asp:TemplateField>
            
<asp:BoundField DataField="Id" HeaderText="分类ID" />
            
<asp:BoundField DataField="Type_Name" HeaderText="分类名" />
             
<asp:BoundField DataField="Parent_Id" HeaderText="所属父类" />
            
<asp:BoundField DataField="Type_AddTime" HeaderText="添加时间" />
            
<asp:TemplateField HeaderText="编 辑">
                
<EditItemTemplate>
                    
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                
</EditItemTemplate>
                
<ItemTemplate>
                   
<div style="width:70px;line-height:20px; cursor:pointer;background-color:#CCCCCC; border:solid 1px #000000; "><a  style="text-decoration:none; cursor:pointer" href='ModifySecondType.aspx?TypeId=<%#Eval("Id") %>'>修改</a></div>
                
</ItemTemplate>
            
</asp:TemplateField>
            
<asp:TemplateField HeaderText="删 除">
                
<EditItemTemplate>
                    
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
                
</EditItemTemplate>
                
<ItemTemplate>
                    
<div onmouseover="javascript:this.style.cursor='hand'" style="width:70px; line-height:20px;background-color:#CCCCCC;border:solid 1px #000000;"> <asp:LinkButton ID="LinkButton1" CommandName="del" CommandArgument='<%# Eval("Parent_Id")+","+Eval("Id")  %>'  runat="server">删除</asp:LinkButton></div>
                
</ItemTemplate>
            
</asp:TemplateField>
          
        
</Columns>
        
<FooterStyle BackColor="#99CCCC" ForeColor="#003399" />
        
<RowStyle BackColor="White" ForeColor="#003399" />
        
<SelectedRowStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" />
        
<PagerStyle BackColor="#99CCCC" ForeColor="#003399" HorizontalAlign="Left" />
        
<HeaderStyle BackColor="#003399" Font-Bold="True" ForeColor="#CCCCFF" />
    
</asp:GridView> 

 

c#代码
protected void GVSecondType_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        
string cmdName = e.CommandName;
        
if (cmdName == "del")
        {
            
string[] estr = e.CommandArgument.ToString().Split(',');

            
int Parent_Id = Convert.ToInt32(estr[0]);
            
int TypeId = Convert.ToInt32(estr[1]);
            
bool flag = YHTBLL.Second_TypeManage.DelTypeById(Parent_Id, TypeId);
            
if (flag)
            {
                
this.Literal1.Text = "删 除 成 功";
                bind();
            }

            
else
            {
                
this.Literal1.Text = "删 除失 败";
                bind();
            }        }    }

 

 


 

 

.net如何获取GridView编辑状态下单元格里的值?先看下面这段代码

var txtName = grid1.Rows[e.RowIndex].Cells[0].FindControl("txtName"as TextBox;
if (txtName != null)
{
    
// 读取值
    
//
}
其实这些工作(在单元格中查找控件,并尝试获取其中的值)已经被封装了。现在,只要调用 ExtractValuesFromCell 方法即可。
而该方法也被很多种列类型所支持:

DataControlField, BoundField, AutoGeneratedField, CheckBoxField, ImageField, TemplateField, DynamicField

你可以在 GridView 的 RowUpdating, RowDeleting 等事件中使用它。利用该方法,可以将值提取到所需的字典里去,然后再从字典中读取。这些字典包括:e.Keys, e.NewValues, e.OldValues 等。
一小段例子代码:

    // 更新
    protected void grid1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        var row = grid1.Rows[e.RowIndex];
        // 提取 Id 字段的值
        grid1.Columns[0].ExtractValuesFromCell(
            e.Keys,
            row.Cells[0] as DataControlFieldCell,
            DataControlRowState.Edit,
            true /* include readonly */);

        // 提取 Name 字段的值
        grid1.Columns[1].ExtractValuesFromCell(
            e.NewValues,
            row.Cells[1] as DataControlFieldCell,
            DataControlRowState.Edit,
            true /* include readonly */);

        var id = int.Parse(e.Keys["id"].ToString());
        var name = (string) e.NewValues["name"];

        // 执行相关的数据库更新操作
        //
    }

这样,在大多数场合我们可以尽可能多的使用 BoundField,并且也能正确读取到其编辑时的值,省下自定义 TemplateField 的一堆代码了。

 

 

 

 

GridView的DataKeyNames的一些用法

页面前台有以下代码:
<asp:GridView ID="View1" Width="100%" runat="server" AutoGenerateColumns="False" CellPadding="3" OnRowDataBound="View1_RowDataBound" CssClass="GbText" DataKeyNames="SubjectID,Mode" CellSpacing="1">

后台有以下代码:
protected void View1_RowDataBound(object sender,GridViewRowEventArgs e)
{
if(View1.DataKeys[e.Row.RowIndex].Values["Mode"].ToString().ToLower() == "false")
{
......
}
}

说明:
由于为GridView控件的DataKeyNames属性设置了表的两个字段(SubjectID,Mode),因此可以在为GridView绑定 数据时对库表的每个记录的指定字段值作出判断。后台代码中的e.Row.RowIndex即表示GridView的当前行(对应于库表的当前记录);而 View1.DataKeys[e.Row.RowIndex].Values["Mode"].ToString()则获取当前行指定字段(Mode) 的值。若前台代码只写:DataKeyNames="SubjectID'(即DataKeyNames属性只填入一个字段名),则后台只需写成: View1.DataKeys[e.Row.RowIndex].Value.ToString()) 即可。
同样的,要动态获取当前行另一个字段的值可以这样写: View.DataKeys[e.Row.RowIndex].Values["SubjectID"].ToString()).当参数为一个时可用或 者View.DataKeys[e.Row.RowIndex].Value.ToString())。

总之,为GridView的DataKeyNames属性设置库表字段名的主要目的还是为了在为GridView控件绑定数据时获取当前行指定字段的值,以便作相应处理。若无此需求的话则GridView的DataKeyNames属性就可以不设置。

----------------------------------------------------------------------------------------------------------------------------------

在我们使用GridView的过程中,经常会遇到这样对问题,我们选择某一行进行编辑,或选择某一行删除或者.......时,我们需要获取当前行的某些信息,尤其是当前行的主键信息,主键信息一般不显示在页面,此时我们有三种方法来处理。
第一种是使用DataKeyNames ,这里只重点介绍这个。
第二种是使用按钮的CommandArgument属性邦定需要的信息。
第三种是最古老最通用的方法使用隐藏的方法显示。

第一种方法:使用DataKeyNames,DataKeyNames可邦定一列,也可邦定多列
前台:DataKeyNames="FID"   绑定一个值
后台:GridView1.DataKeys[e.Row.RowIndex].Value.ToString();

前台:DataKeyNames="FID,FName"   绑定两个值
后台:GridView1.DataKeys[e.Row.RowIndex].Values[0].ToString();
后台:GridView1.DataKeys[e.Row.RowIndex].Values[1].ToString();
或者
后台:GridView1.DataKeys[e.Row.RowIndex].Values["FID"].ToString();
后台:GridView1.DataKeys[e.Row.RowIndex].Values["FName"].ToString();