DataGridView,CS开发模式,有思路即可。1、如何固化某行色彩(某特定符合条件行,如某列信息为特定值)
不推荐使用CellFormatting事件(排序就要激发,数据量如果很大,判断会很罗嗦)
没有找到绑定行事件
如果对行进行设置,每次重新排序,信息就会丢失2、加入行号
行头中,如何设置行号?

解决方案 »

  1.   

    http://blog.csdn.net/cnming/archive/2007/12/14/1935874.aspx在数据加载完成的事件中修改每行的颜色,不仅仅交替,若干种颜色轮流也可以.using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;namespace Costaco.CTN.Controls
    {
        public class DataGridView : System.Windows.Forms.DataGridView
        {        public DataGridView()
            {
            }
            //这里键入override,然后空格就会出来重写的列表,你选一个回车就可以了写出不同的override        protected override void OnDataBindingComplete(DataGridViewBindingCompleteEventArgs e)
            {
                if (this.Rows.Count != 0)
                {
                    for (int i = 0; i < this.Rows.Count; i++)
                    {
                        if ((i % 2) == 1)
                        {
                            this.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.WhiteSmoke;
                        }
                        else
                        {
                            this.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.LightBlue;
                        }
                    }
                }                       base.OnDataBindingComplete(e);
            }
        }
    }
      通过继承原有的控件,直接实现交替颜色,也可以实现多行交替颜色。 
      

  2.   

    通过继承原有的DataGrid控件,然后重写里头的相应方法,假如不是数据加载模式,也可以重写其它事件来修改颜色.然后你只要把原先引用的System.Windows.Forms.DataGridView改为你自己对应的即可,例如这里的修改为Costaco.CTN.Controls.DataGridView
      

  3.   

    <asp:DataGrid id="DataGrid1" runat="server">
         <Columns>
          <asp:TemplateColumn>
           <ItemTemplate>
            <%# this.DataGrid1.Items.Count + 1%>
           </ItemTemplate>
          </asp:TemplateColumn>
         </Columns>
    </asp:DataGrid>=================
    AllowPaging="True"下 
    如果你DataGrid支持分页则可以如下【在翻页之后仍能维持数字继续编号】<asp:DataGrid id="DataGrid1" runat="server" AllowPaging="True">
         <Columns>
          <asp:TemplateColumn>
           <ItemTemplate>
            <%# this.DataGrid1.CurrentPageIndex * this.DataGrid1.PageSize + Container.ItemIndex + 1%>
           </ItemTemplate>
          </asp:TemplateColumn>
         </Columns>
    </asp:DataGrid>
    这是datagird中的方法,你稍加修改就ok了。
    我试过的。
      

  4.   

    cnming :
    主要考虑效率问题,这些我都大多试验过了,而且多行交替颜色,这个控件自己就有,何必单独去设置??如果不排序,就算在CellFormatting里面也没有问题,排序色彩是会丢失的。'RowPostPaint 切换窗口也会重绘
    'CellFormatting 每次都要把所有的单元格判断一遍
    'DataBindingComplete
    问题集中在:排序、填充两种情况后,如何用最优的算法,进行色彩保留。
      

  5.   

    可以设置DataGrid的隔行颜色来实现AlternatingItemStyle
      

  6.   

    事实 重写 oncellpainting 和 onpainting事件.这样可以避免许多无谓的运算.当你的datagridview有特殊显示要求的时候,最好如此.如果采用其他修改属性的办法,会使性能降低.
      

  7.   

    cnming :
    1、设置交替色,有默认的属性AlternatingRowsDefaultCellStyle可用,实在不知道你为什么要自己写呵;
    2、设置符合条件的数据行样式(如符合条件前景色为红色)
    在排序后,肯定会样式丢失的(还原为默认样式,但是交替色不丢的);采用行绘制刷新模式,经过测试,效率一般,不过总感觉别扭,每次进行窗体切换,都要激发。
    采用数据绑定后绘制,会在排序后丢失。
      

  8.   

    如果一定要选的话,我宁愿使用RowPostPaint,呵呵,毕竟刷新的时候,不会一次生成那么多
    不过麻烦在每次都要刷新——重复执行率太高了。
      

  9.   

    为什么要自己写    很简单了,因为不知道有这个属性,我所用的控件都进行了重写,例如textbox重写之后获得焦点就执行所有文本全选,combox获得焦点就下拉等等,习惯了。现在理解了你的需求,你仅仅想要某些特定行变换颜色,如果这样的话,你应该取出每一个行的关键列进行判断是否该有特殊颜色了,好像计算的工作是不能免得,例如有控件直接执行小于0的值为红色,那也是经过了控件的判断而给定的颜色,当然如果从控件最底层开始写的话,或许可以进行分组刷新,把同一种颜色的分为一组,统一刷新,这样可能会快一些。
    目前如果使用别人的控件,估计只能一个一个判断。
      

  10.   


    只刷新可见字段部份或许可以满足你的需求,重写某个事件,对当前可见的部分进行修改颜色。例如下面的代码
    protected virtual void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {
                if (e.Value == null) return;            foreach (DataGridViewColumn d in this.dataGridView.Columns) //为克服 DataGridView BUG (只刷新可见字段部份)
                {
                    if (d.Name.IndexOf("IsStop") != -1)
                    {
                        if (this.dataGridView.Rows[e.RowIndex].Cells[d.Index].Value.ToString() == "是")
                            this.dataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Coral;
                    }
                    if (d.Name.IndexOf("IsDefault") != -1)
                    {
                        if (this.dataGridView.Rows[e.RowIndex].Cells[d.Index].Value.ToString() == "是")
                            this.dataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.YellowGreen;
                    }
                    if (d.Name.IndexOf("IsCurrent") != -1)
                    {
                        if (this.dataGridView.Rows[e.RowIndex].Cells[d.Index].Value.ToString() == "是")
                            this.dataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.BlueViolet;
                    }
                }           
            }
     
      

  11.   

    对单元格,一般采用CellPainting事件
    对行,一般采用RowPostPaint事件
    对于CS程序来说,很多时候刷新是不可避免的,不过一般情况下,效率还是可以的,不会很慢。
    只有尽量设置条件来减少循环。最好是把控件重写来实现!
      

  12.   

    其实对RowPostPaint一样可以操作单元格的,至少刷新次数会少N次,N=列数-1的;似乎没有更好效率的办法,只能绘制了。
      

  13.   

    郁闷哦==================================================================
    博客空间:http://blog.csdn.net/lovingkiss
    资源下载:http://download.csdn.net/user/lovingkiss
    Email:loving-kiss@163.com
    优惠接单开发,组件控件定制开发,成品源代码批发
    联系方式:Q66840199  全天在线
    ==================================================================
      

  14.   

    关于符合条件的行,在DataSet里加一个字段,先筛选一遍符合的更改该字段,
    没试过,不知这个办法是否可行
      

  15.   

    试试RowPrePaint,可能会比RowPostPaint好点,再怎么优化绘制总是必须的。
    至于显示行号,不知道你需不需要分页。可以研究一下DataGridView的VirtualMode,应该是你想要的。
      

  16.   

    测试了一下,把DataGridView的VirtualMode设为true,然后手动添加一列未绑定的TextBoxColumn,
    添加CellValueNeeded事件:
    private void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
            {
                //if(e.ColumnIndex是行号列)
                e.Value = e.RowIndex + 1;
            }
    看看是不是要这个
      

  17.   

    我觉得用来显示的话 用asp:Repeater 更好,方便格式设置和色彩控制
    下面是一段定义Repeater的前台代码:(我还给你注上说明哦!!!)
    <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#a0afc4">
          <asp:Repeater ID="Repeater1" runat="server" //定义一个Repeater id是Repeater1  
    OnItemCommand="Repeater1_ItemCommand">
                  <HeaderTemplate>   //列表第一行字段设置
                  <tr>
                  <td height="26" background="images/lmbg1.jpg">&nbsp;</td>
                  <td align="center" background="images/lmbg1.jpg"><strong>ID&nbsp;&nbsp; </strong></td>
                  <td align="center" background="images/lmbg1.jpg"><strong>参数名</strong></td>
                  <td align="center" background="images/lmbg1.jpg"><strong>邮箱</strong></td>
                  <td align="center" background="images/lmbg1.jpg"><strong>手机</strong></td>
                  <td align="center" background="images/lmbg1.jpg"><strong>说明</strong></td>
                  <td align="center" background="images/lmbg1.jpg"><strong>设置该参数下的关键字</strong></td>
                  <td align="center" background="images/lmbg1.jpg"><strong>查看该参数的记录</strong></td>
                </tr>
                  
                  </HeaderTemplate>          //第一行字段设置结束
                  <ItemTemplate>              // 中间显示字段设置
                  <tr bgcolor="#FFFFFF">       //色彩设置
                  <td align="center" valign="top" ><a href="shujubj.aspx?id=<%# Eval("id") %>">编辑</a>&nbsp;&nbsp;&nbsp;&nbsp; <asp:LinkButton ID="LinkButton1" CommandName='<%# Eval("id").ToString()%>' runat="server" OnClientClick="return confirm('确定删除该参数?该参数下的关键词将一同删除');">删除</asp:LinkButton></td>
                  <td align="center" valign="top" > <%# DataBinder.Eval(Container.DataItem, "id")   %></td>
                  <td align="center" valign="top" > <%# DataBinder.Eval(Container.DataItem, "username")   %></td>
                  <td align="center" valign="top" > <%# DataBinder.Eval(Container.DataItem, "email")%></td>
                  <td align="center" valign="top" > <%# DataBinder.Eval(Container.DataItem, "mobile")%></td>
                  <td align="center" valign="top" > <%# DataBinder.Eval(Container.DataItem, "kehuming")%></td>
                  <td align="center" valign="top" ><a href="cssz.aspx?id=<%# Eval("id") %>">设置该参数下的关键字</a></td>
                  <td align="center" valign="top" ><a href="shujugl.aspx?id=<%# Eval("id") %>">敏感词检测清单</a></td>
                </tr>
                  </ItemTemplate>      //中间设置结束
                  <AlternatingItemTemplate>   //中间交替行设置(和中间显示一样)
                  <tr bgcolor="#ecf3f9">      //交替颜色设置
                  <td align="center" valign="top" ><a href="shujubj.aspx?id=<%# Eval("id") %>">编辑</a>&nbsp;&nbsp;&nbsp;&nbsp; <asp:LinkButton ID="LinkButton1" CommandName='<%# Eval("id").ToString()%>' runat="server" OnClientClick="return confirm('确定删除该参数?该参数下的关键词将一同删除');">删除</asp:LinkButton></td>
                  <td align="center" valign="top" > <%# DataBinder.Eval(Container.DataItem, "id")   %></td>
                  <td align="center" valign="top" > <%# DataBinder.Eval(Container.DataItem, "username")   %></td>
                  <td align="center" valign="top" > <%# DataBinder.Eval(Container.DataItem, "email")%></td>
                  <td align="center" valign="top" > <%# DataBinder.Eval(Container.DataItem, "mobile")%></td>
                  <td align="center" valign="top" > <%# DataBinder.Eval(Container.DataItem, "kehuming")%></td>
                  <td align="center" valign="top" ><a href="cssz.aspx?id=<%# Eval("id") %>">设置该参数下的关键字</a></td>
                  <td align="center" valign="top" ><a href="shujugl.aspx?id=<%# Eval("id") %>">敏感词检测清单</a></td>
                </tr>
                  </AlternatingItemTemplate>  //中间交替设置结束
                  </asp:Repeater>                   //定义结束下面是分页设置:
                  <TR bgcolor="#FFFFFF">
                    <TD colSpan="8" height="30" align="center"><FONT class=contents><asp:linkbutton id="Fistpage" Runat="server" CommandName="0">首页</asp:linkbutton> <asp:linkbutton id="Prevpage" Runat="server" CommandName="prev">上一页</asp:linkbutton> <asp:linkbutton id="Nextpage" Runat="server" CommandName="next">下一页</asp:linkbutton> <asp:linkbutton id="Lastpage" Runat="server" CommandName="last">尾页</asp:linkbutton>  页次:<asp:label id="LCurrentPage" Runat="server" ></asp:label>/<asp:label id="LPageCount" Runat="server" ></asp:label>页 共有<font color="#FF0000"><asp:label id="LRecordCount" Runat="server" ForeColor="#ff0000"></asp:label></font>条信息</FONT>
    跳页<asp:TextBox ID="gotoPage" Runat="server" Width="50px" MaxLength="5" AutoPostBack="True"></asp:TextBox>
    </TD>
                  </TR>
                  </table>
    本人学习时间不长,如有错误,请大家指正。
      

  18.   

    补充:
    <%# DataBinder.Eval(Container.DataItem, "id") %> 是绑定id字段