2016-08-01 3 views
0

Можете ли вы мне помочь с этим кодом? Я хочу научиться использовать Invalidate и Update, но я не уверен, как его использовать Этот код не работает. Я хочу установить новый текст, но он не «обновляется» и не пишет новую строку «Prova». БлагодаряC# - Invalidate() и Update()

namespace Invalidate 
{ 
public partial class Form1 : Form 
{ 
    private String txt; 
    private PointF xy; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawString("This is the text that prints!", 
     this.Font, System.Drawing.Brushes.Azure, 0, 0); 
    } 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     Panel pHText = new Panel(); 
     pHText.Name = "ctrId"; 
     pHText.Location = new Point(10, 10); 
     pHText.Size = new Size(200, 200); 
     pHText.BackColor = Color.White; 
     pHText.Paint += paintingUrCtr; 
     Controls.Add(pHText); 
    } 

    private void paintingUrCtr(object sender, PaintEventArgs e) 
    { 
     Font myFont = new Font("Arial", 14); 
     e.Graphics.DrawLine(new Pen(Color.Black), 0, 0, 10, 10); 
     e.Graphics.DrawString(this.txt, myFont, Brushes.Blue, 10, 10); 
    } 
    public void setText(String text, PointF pos) 
    { 
     this.txt = text; 
     this.xy = pos; 
    } 
    private void button_Click(object sender, EventArgs e) 
    { 
     setText("Prova", new PointF(100, 100)); 
     this.Invalidate(); 
     this.Update(); 
    } 
} 
} 
+0

Пожалуйста, включите сообщение об ошибке, и объяснение ожидаемых против фактического поведения –

+0

HI, этот код не записывает новую строку «Prova», когда я нажимаю на кнопки –

+0

Вы недействительности форму, а не панели , Минимизируйте свою форму, затем восстановите ее, чтобы увидеть текст. – LarsTech

ответ

0

Вызов this.Invalidate(); не отменяет дочерние элементы управления, необходимо использовать перегрузку that takes in a bool и передать в true

private void button_Click(object sender, EventArgs e) 
{ 
    setText("Prova", new PointF(100, 100)); 
    this.Invalidate(true); 
    this.Update(); 
} 

EDIT: как уже упоминалось в комментариях, вы можете также просто аннулирует одно дочернее управление и обновление.

private void button_Click(object sender, EventArgs e) 
{ 
    setText("Prova", new PointF(100, 100)); 
    this.Controls["ctrId"].Invalidate(true); 
    this.Controls["ctrId"].Update(); 
} 
+1

Я проверил ваш последний код, и он работает без (true) –

+0

Благодаря LarsTech и Scott Chamberlain –