GridView——标题行自适应单元格列宽与选中单元格变色

首先看效果图:

 

主要实现——

1.前台GridView代码:

<asp:GridView Height="100%" Width="98%" ID="DataGrid1" runat="server" AutoGenerateColumns="False"
    EnableModelValidation="True" Font-Size="9pt"  style="overflow:scroll"
    onrowcommand="DataGrid1_RowCommand" AllowPaging="True" 
    onpageindexchanging="DataGrid1_PageIndexChanging" PageSize="20" 
    onrowdatabound="DataGrid1_RowDataBound">                                                                     
    <Columns>
        <asp:TemplateField HeaderText="图片">
            <ItemTemplate>
                <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="false" 
                    CommandArgument ='<%# Eval("SEQ_NO") %>'   CommandName="ViewPicture" Text="图片"></asp:LinkButton>
            </ItemTemplate>
            <HeaderStyle />
            <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
        </asp:TemplateField>                                                                        
        <asp:BoundField DataField="CUSTOMS_NAME" HeaderText="关区">
            <HeaderStyle></HeaderStyle>
            <ItemStyle HorizontalAlign="Center"></ItemStyle>
        </asp:BoundField>

主要事件是: onrowdatabound="DataGrid1_RowDataBound"

2.后台代码:

        protected void DataGrid1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            //固定标题行列宽            
            if (e.Row.RowType == DataControlRowType.Header)//当前是标题行
            {
                //保持列不变形有两种方法: 
                //方法一是设置cell的自动换行属性为false,方法二是用html标记的方式实现不换行; 就是一个空格,可以让网格线和里面的内容留有一定的距离保持美观。
                for (int i = 0; i < e.Row.Cells.Count; i++)
                {
                    ////方法一: 
                    //e.Row.Cells[i].Text = " " + e.Row.Cells[i].Text + " ";
                    //e.Row.Cells[i].Wrap = false;

                    //方法二: 
                    e.Row.Cells[i].Text = "<nobr> " + e.Row.Cells[i].Text + " </nobr>";
                }
            }
            else if (e.Row.RowType == DataControlRowType.DataRow)//当前是数据行
            {
                e.Row.Attributes.Add("onclick", e.Row.ClientID.ToString() + ".checked=true;selectx(this)");//点击行变色
                // e.Row.Attributes.Add("onmouseover", "if(this!=prevselitem){this.style.backgroundColor='#Efefef'}");//当鼠标停留时更改背景色
                // e.Row.Attributes.Add("onmouseout", "if(this!=prevselitem){this.style.backgroundColor='#ffffff'}");//当鼠标移开时还原背景色                
                //e.Row.Attributes["style"] = "Cursor:hand"; //设置悬浮鼠标指针形状为"小手"
                //GridView1.HeaderRow.Cells[10].Visible = false;
                // e.Row.Cells[10].Visible = false;//隐藏选择按钮
                //String evt = Page.ClientScript.GetPostBackClientHyperlink(sender as System.Web.UI.WebControls.GridView, "Select$" + e.Row.RowIndex.ToString());
                // e.Row.Attributes.Add("onclick", evt);//执行选择行GridView1_SelectedIndexChanged事件

                //固定单元格行列宽
                for (int i = 0; i < e.Row.Cells.Count; i++)
                {
                    ////方法一: 
                    //e.Row.Cells[i].Text = " " + e.Row.Cells[i].Text + " ";
                    e.Row.Cells[i].Wrap = false;
                }
            }

        }

 

注意:针对标题行,方法一和方法二都试用,针对数据行,则只适用方法一,且方法一的 e.Row.Cells[i].Text = " " + e.Row.Cells[i].Text + " ";  要注释掉 ,即前后增加空格不能用,因为数据行如果遇到模板列TemplateField,列中的数据将会被替换成空内容。


选中的单元格变色,需要加上如下JS代码
 <script type="text/javascript">
        var prevselitem = null;
        function selectx(row) {
            if (prevselitem != null) {
                prevselitem.style.backgroundColor = '#DDEDFF';
            }
            row.style.backgroundColor = 'PeachPuff';
            prevselitem = row;

        }
    </script>

  

此外,如果想让GridView出现横向滚动条,需要在外面套一个如下的div:

 <div style="width: 100%; height: auto; overflow: scroll;text-align:center;">

 
posted @ 2016-05-26 10:04  夏空  阅读(691)  评论(0编辑  收藏  举报