我在网上下了一个表格类,但发现这个类在批量加数据时有时会重绘失败变成一个大红叉,现在想加多一个功能就是增加一个属性来控制是否让这个表格重绘,在网上查了一个有人说只截取所有的重绘消息就行了,但我是菜鸟可不可以具体一点给点代码,谢谢大侠们了!

解决方案 »

  1.   

    C# richTextbox的 字体格式颜色等等 【关于字体格式】设置的是第一个字符的颜色,这时richtextBox的rtf中记录下位置0的颜色,重置text时,在rtf中的位置从位置0开始,因此颜色还是Color.Red,第三次也应该同样如此
    richTextBox1.Text = "123";
    richTextBox1.Select(0, 1);
    richTextBox1.SelectionColor = Color.Red;
    richTextBox1.Clear();//清除文本,包括样式
    //或richTextBox1.Text="";
    richTextBox1.Text = "abc";
    richTextBox1.Text = "efg";
    这样重置后的文本颜色就会是黑色.【关键字着色】public partial class RichTextBox : Form
        ...{
            public RichTextBox()
            ...{
                 InitializeComponent();
             }        private void tSql_TextChanged(object sender, EventArgs e) //文本框改变事件
            ...{
                int index = this.tSql.SelectionStart;    //记录修改的位置
                this.tSql.SelectAll();
                this.tSql.SelectionColor = Color.Black;
    string[] keystr =...{ "select ", "from ", "where ", " and ", " or ", " order ", " by ", " desc ", " when ", " case ",
       " then ", " end ", " on ", " in ", " is ", " else ", " left ", " join ", " not ", " null " };
                for (int i = 0; i < keystr.Length; i )
                    this.getbunch(keystr[i], this.tSql.Text);            this.tSql.Select(index, 0);     //返回修改的位置
                this.tSql.SelectionColor = Color.Black;         }
            public int getbunch(string p, string s) //给关键字上色
            ...{
                int cnt = 0; int M = p.Length; int N = s.Length;
                char[] ss = s.ToCharArray(), pp = p.ToCharArray();
                if (M > N) return 0;
                for (int i = 0; i < N - M 1; i )
    {
                    int j;
                    for (j = 0; j < M; j )
                    ...{
                        if (ss[i j] != pp[j]) break;
                     }
                    if (j == p.Length)
                    ...{
                        this.tSql.Select(i, p.Length);
                        this.tSql.SelectionColor = Color.Blue;
                         cnt ;
                     }
    }
                return cnt;         }     }
      【绘制颜色提议】最好的做法是继承RichTextBox,重载新类的Paint方法。 并且在设置SelectionLength的时候,禁止控件的重绘过程,这样才不会出现被语法高亮的文本有一个突然选中的过程。 以下2个方法将会对你解决这一问题有很大的帮助. 
    [DllImport("user32")] 
    private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam); 
    private const int WM_SETREDRAW = 0xB; //停止控件的重绘 
    private void BeginPaint() 

    SendMessage(yourRichTextBox.Handle, WM_SETREDRAW, 0, IntPtr.Zero); 
    } //允许控件重绘. 
    private void EndPaint() 

    SendMessage(yourRichTextBox.Handle, WM_SETREDRAW, 1, IntPtr.Zero); 
    yourRichTextBox.Refresh(); 

      

  2.   

    最好的做法是继承RichTextBox,重载新类的Paint方法。 并且在设置SelectionLength的时候,禁止控件的重绘过程,这样才不会出现被语法高亮的文本有一个突然选中的过程。 以下2个方法将会对你解决这一问题有很大的帮助. 
    [DllImport("user32")] 
    private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam); 
    private const int WM_SETREDRAW = 0xB; //停止控件的重绘 
    private void BeginPaint() 

    SendMessage(yourRichTextBox.Handle, WM_SETREDRAW, 0, IntPtr.Zero); 
    } //允许控件重绘. 
    private void EndPaint() 

    SendMessage(yourRichTextBox.Handle, WM_SETREDRAW, 1, IntPtr.Zero); 
    yourRichTextBox.Refresh(); 
      

  3.   

    TO:jingshuaizhjason 好象不行呀,我用的是VB.net 代码如下,但效果相当于控件的Visible=False,控件完全看不到,而我只是希望控件不重绘但仍然可见的,应该说是静止的吧Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
        Const WM_SETREDRAW As Integer = &H10   '0xB
        Private Sub MyBase_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
            If NoDrawGrid = True Then  '不重绘控件
                SendMessage(MyBase.Handle.ToInt32, WM_SETREDRAW, 0, IntPtr.Zero.ToInt32)
            End If    End Sub