I have Label in Panel. In timer.Tick new value write in Label.Text, but in form not change.
Program.cs:
static void Main(string[] args)
{
MainForm mainForm = new MainForm();
Engine engine = new Engine(mainForm);
Application.Run(mainForm);
}
MainForm.cs
public partial class MainForm : Form
{
public MatchesPanel panel;
public MainForm()
{
InitializeComponent();
this.Load += MainForm_Load;
this.panel = new MatchesPanel("panel", new System.Drawing.Point(0, 52));
this.panel.Name = "panel";
this.panel.TabIndex = 8;
this.Controls.Add(this.panel);
}
}
MatchesPanel.cs
public class MatchesPanel : Panel
{
public string Name;
int VWheelSize = 0;
Dictionary<string, Label> Items = new Dictionary<string, Label>();
Label InFocus = null;
public MatchesPanel(string name, Point location)
{
Name = name;
this.BackColor = System.Drawing.SystemColors.GradientActiveCaption;
this.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.Location = location;
this.Margin = new System.Windows.Forms.Padding(0);
this.Size = new System.Drawing.Size(400, 323);
this.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.MouseWheel += This_MouseWheel;
this.Click += This_Click;
this.Invalidated += MatchesPanel_Invalidated;
}
void Label_Click(object s, EventArgs e)
{
Label l = (Label)s;
l.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
l.BackColor = System.Drawing.Color.MediumTurquoise;
if (InFocus != null && InFocus != l)
{
InFocus.BorderStyle = System.Windows.Forms.BorderStyle.None;
InFocus.BackColor = System.Drawing.SystemColors.GradientActiveCaption;
}
InFocus = l;
l.Focus();
}
public void SetText(string key, string text)
{
Label l = Items[key];
l.Text = text;
}
public void Add(string key, string text)
{
Label label = new Label();
label.AllowDrop = true;
label.BackColor = System.Drawing.SystemColors.GradientActiveCaption;
label.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
label.Location = new Point(0, Items.Count * 37 + VWheelSize);
label.Margin = new System.Windows.Forms.Padding(0);
label.Padding = new System.Windows.Forms.Padding(3);
label.Size = new System.Drawing.Size(400, 37);
label.Text = text;
label.Click += Label_Click;
label.LostFocus += Label_LostFocus;
label.MouseLeave += Label_MouseLeave;
label.MouseMove += Label_MouseMove;
this.Controls.Add(label);
Items.Add(key, label);
}
public void UpdateMatches(Dictionary<string, Match> Matches)
{
string newStr;
// calculate newStr...
// in debugger i check newStr value and this right
// but text not updating
this.SetText(key, newStr);
}
}
Engine.cs
public class Engine
{
System.Windows.Forms.Timer timer = null;
public Dictionary<string, Match> Matches;
MainForm MainForm = null;
public Engine(MainForm mainForm)
{
MainForm = mainForm;
Matches = new Dictionary<string, Match>();
timer = new System.Windows.Forms.Timer();
timer.Tick += timer_Tick;
timer.Interval = 1000;
timer.Start();
}
public void timer_Tick(object s, EventArgs e)
{
System.Windows.Forms.Timer timer = (System.Windows.Forms.Timer)s;
timer.Stop();
Proc();
timer.Start();
}
public async void Proc()
{
// do something...
MainForm.Invoke((System.Windows.Forms.MethodInvoker)delegate()
{
MainForm.panel.UpdateMatches(Matches);
});
}
}
I try use:
Label.Update();
Label.Refresh();
Label.Invalidate();
but it not work.
If I click in label, when it not in focus (InFocus != sourceLabel in clickHandler), text value updating in sourceLabel one time. Help me pls. I read another topics and not find solve. If need more code, tell me. Thx.
[EDIT] I simplified my code.
Program.cs:
static void Main(string[] args)
{
MainForm mainForm = new MainForm();
Engine engine = new Engine(mainForm);
Application.Run(mainForm);
}
MatchesPanel.cs
public class MatchesPanel : Panel
{
Dictionary<string, Label> Items = new Dictionary<string, Label>();
public MatchesPanel(Point location)
{
this.BackColor = System.Drawing.SystemColors.GradientActiveCaption;
this.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.Location = location;
this.Margin = new System.Windows.Forms.Padding(0);
this.Size = new System.Drawing.Size(400, 323);
this.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
}
public void SetText(string key)
{
Label l = Items[key];
l.Text = DateTime.Now.ToString();
}
public void Add(string key)
{
Label label = new Label();
label.Name = key;
label.AllowDrop = true;
label.BackColor = System.Drawing.SystemColors.GradientActiveCaption;
label.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
label.Location = new Point(0, Items.Count * 37 + VWheelSize);
label.Margin = new System.Windows.Forms.Padding(0);
label.Padding = new System.Windows.Forms.Padding(3);
label.Size = new System.Drawing.Size(400, 37);
label.Text = DateTime.Now.ToString();
this.Controls.Add(label);
Items.Add(key, label);
}
}
Engine.cs
public class Engine
{
System.Windows.Forms.Timer timer = null;
public MatchesPanel panel = null;
MainForm MainForm = null;
public Engine(MainForm mainForm)
{
MainForm = mainForm;
timer = new System.Windows.Forms.Timer();
timer.Tick += timer_Tick;
timer.Interval = 1000;
timer.Start();
}
public void timer_Tick(object s, EventArgs e)
{
System.Windows.Forms.Timer timer = (System.Windows.Forms.Timer)s;
timer.Stop();
MainForm.Invoke((System.Windows.Forms.MethodInvoker)delegate()
{
if (panel == null)
{
panel = new MatchesPanel(new System.Drawing.Point(0, 52));
panel.Name = "key1";
// add label in main form
panel.Add("key1");
MainForm.Controls.Add(panel);
}
panel.SetText("key1");
});
timer.Start();
}
}
Problem:
Label.Text not updating.
Solve:
Now my "label" is updated.