Dynamically changing the text of items in a Winforms ComboBox - c#

I have a Winforms ComboBox that contains instances of a custom class. When the items are first added to the Items collection of the ComboBox, the ToString method is call on each of them.
However when the user changes the language the application is running in, the result of the ToString method changes.
Therefore how can I get the ComboBox to call the ToString method on all items again without having to remove all items from the ComboBox and adding them back in?

Thanks svick, RefreshItems() work, however as it is protected (so can only be called by a subclass) I had to do
public class RefreshingComboBox : ComboBox
{
public new void RefreshItem(int index)
{
base.RefreshItem(index);
}
public new void RefreshItems()
{
base.RefreshItems();
}
}
I have just had to do the same for a ToolStripComboBox, however it was a bit harder as you can not subclass the Combro box it contains, I did
public class RefreshingToolStripComboBox : ToolStripComboBox
{
// We do not want "fake" selectedIndex change events etc, subclass that overide the OnIndexChanged etc
// will have to check InOnCultureChanged them selfs
private bool inRefresh = false;
public bool InRefresh { get { return inRefresh; } }
public void Refresh()
{
try
{
inRefresh = true;
// This is harder then it shold be, as I can't get to the Refesh method that
// is on the embebed combro box.
//
// I am trying to get ToString recalled on all the items
int selectedIndex = SelectedIndex;
object[] items = new object[Items.Count];
Items.CopyTo(items, 0);
Items.Clear();
Items.AddRange(items);
SelectedIndex = selectedIndex;
}
finally
{
inRefresh = false;
}
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
if (!inRefresh)
{
base.OnSelectedIndexChanged(e);
}
}
}
I had to do the same trip to stop unwanted events for the normal CombroBox, by overriding OnSelectedValueChanged, OnSelectedItemChanged and OnSelectedIndexChanged, as the code is the same as for the ToolStripComboBox I have not included it here.

You should be able to do this by calling the RefreshItems() method.

I use this extension:
/// <summary>
/// Recreates the items
/// </summary>
public static void RefreshItems(this ComboBox cb)
{
var selectedIndex = cb.SelectedIndex;
cb.SelectedIndex = -1;
MethodInfo dynMethod = cb.GetType().GetMethod("RefreshItems", BindingFlags.NonPublic | BindingFlags.Instance);
dynMethod.Invoke(cb, null);
cb.SelectedIndex = selectedIndex;
}

svick is right. However, as Ian Ringrose mentions, a subclass is necessary.
RefreshItems is a protected method for System.Windows.Forms.ComboBox.
A Forms application below provides an example of the behavior, and the RefreshItems method updating the ComboBox:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public class Form1 : Form
{
private List<HelloWorld> helloWorlds;
#region Form1.Designer.cs
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose( bool disposing )
{
if ( disposing && (components != null) )
{
components.Dispose();
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.comboBox1 = new RefreshingComboBox();
this.comboBox2 = new RefreshingComboBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// comboBox1
//
this.comboBox1.FormattingEnabled = true;
this.comboBox1.Location = new System.Drawing.Point( 76, 12 );
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size( 115, 21 );
this.comboBox1.TabIndex = 0;
//
// comboBox2
//
this.comboBox2.FormattingEnabled = true;
this.comboBox2.Location = new System.Drawing.Point( 250, 12 );
this.comboBox2.Name = "comboBox2";
this.comboBox2.Size = new System.Drawing.Size( 218, 21 );
this.comboBox2.TabIndex = 1;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point( 12, 15 );
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size( 58, 13 );
this.label1.TabIndex = 2;
this.label1.Text = "Language:";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point( 213, 15 );
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size( 31, 13 );
this.label2.TabIndex = 3;
this.label2.Text = "Text:";
//
// button1
//
this.button1.Location = new System.Drawing.Point( 34, 42 );
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size( 75, 23 );
this.button1.TabIndex = 4;
this.button1.Text = "Set All";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler( this.button1_Click );
//
// button2
//
this.button2.Location = new System.Drawing.Point( 116, 42 );
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size( 75, 23 );
this.button2.TabIndex = 5;
this.button2.Text = "Set Random";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler( this.button2_Click );
//
// button3
//
this.button3.Location = new System.Drawing.Point( 393, 42 );
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size( 75, 23 );
this.button3.TabIndex = 6;
this.button3.Text = "Refresh!";
this.button3.UseVisualStyleBackColor = true;
this.button3.Click += new System.EventHandler( this.button3_Click );
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF( 6F, 13F );
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size( 556, 77 );
this.Controls.Add( this.button3 );
this.Controls.Add( this.button2 );
this.Controls.Add( this.button1 );
this.Controls.Add( this.label2 );
this.Controls.Add( this.label1 );
this.Controls.Add( this.comboBox2 );
this.Controls.Add( this.comboBox1 );
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout( false );
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ComboBox comboBox1;
private System.Windows.Forms.ComboBox comboBox2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
#endregion
public Form1()
{
InitializeComponent();
comboBox1.DataSource = new HelloWorld().GetLanguages();
helloWorlds = new List<HelloWorld>();
while ( helloWorlds.Count < 10 )
{
helloWorlds.Add( new HelloWorld() );
}
comboBox2.DataSource = helloWorlds;
}
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
Application.Run( new Form1() );
}
private void changeAllLanguages()
{
HelloWorld.LanguageValue newLang = (HelloWorld.LanguageValue) comboBox1.SelectedValue;
helloWorlds.ForEach(
delegate( HelloWorld hw )
{
hw.Language = newLang;
} );
}
private void changeRandomLanguage()
{
int index = new Random().Next( helloWorlds.Count );
HelloWorld.LanguageValue newLang = (HelloWorld.LanguageValue) comboBox1.SelectedValue;
helloWorlds[index].Language = newLang;
}
private void button1_Click( object sender, EventArgs e )
{
changeAllLanguages();
}
private void button2_Click( object sender, EventArgs e )
{
changeRandomLanguage();
}
private void button3_Click( object sender, EventArgs e )
{
(comboBox2 as RefreshingComboBox).RefreshItems();
}
}
public class RefreshingComboBox : System.Windows.Forms.ComboBox
{
public new void RefreshItem(int index)
{
base.RefreshItem(index);
}
public new void RefreshItems()
{
base.RefreshItems();
}
}
public class HelloWorld
{
public enum LanguageValue
{
English,
日本語,
Deutsch,
Français,
Český
}
private LanguageValue language;
public LanguageValue Language
{
get
{
return language;
}
set
{
language = value;
}
}
public Array GetLanguages()
{
return Enum.GetValues( typeof( LanguageValue ) );
}
Dictionary<LanguageValue, string> helloWorlds;
public HelloWorld()
{
helloWorlds = new Dictionary<LanguageValue, string>();
helloWorlds[LanguageValue.English] = "Hello, world!";
helloWorlds[LanguageValue.日本語] = "こんにちは、世界!";
helloWorlds[LanguageValue.Deutsch] = "Hallo, Welt!";
helloWorlds[LanguageValue.Français] = "Sallut, monde!";
helloWorlds[LanguageValue.Český] = "Ahoj svět!";
}
public override string ToString()
{
return helloWorlds[language];
}
}
}

Related

Accessing getter from another class

Hey I have two classes
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BMIcalculator
{
class BmrCalculator
{
BMIcalculator BMICalc = new BMIcalculator();
private int age;
private double BMR;
private Gender Gender;
private double weight;
private double height;
public void setWeight(double weight)
{
this.weight = weight;
}
public void setHeight(double height)
{
this.height = height;
}
public double GetWeight()
{
return weight;
}
public double GetHeight()
{
return height;
}
public void SetGender(Gender Gender)
{
this.Gender = Gender;
}
public Gender GetGender()
{
return this.Gender;
}
public double CalculateBMR()
{
if (Gender == Gender.Female)
{
BMR = (10 * weight) + (6.25 * height) - (5 * age) - 161;
}
else
{
BMR = (10 * BMICalc.getWeight()) + (6.25 * BMICalc.getHeight()) - (5 * age) + 5;
}
return BMR;
}
public void SetAge(int age)
{
this.age = age;
}
}
}
2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BMIcalculator
{
class BMIcalculator
{
private double height;
private double weight;
private UnitTypes unit;
public BMIcalculator()
{
unit = UnitTypes.Metric;
}
#region Setters and getters
public double getHeight()
{
return height;
}
public void setHeight(double height)
{
if(height >= 0.0)
this.height = height;
}
public double getWeight()
{
return weight;
}
public void setWeight(double weight)
{
if (weight >= 0.0)
this.weight = weight;
}
public UnitTypes getUnit()
{
return unit;
}
public void setUnit(UnitTypes unit)
{
this.unit = unit;
}
#endregion
}
}
Main form:
namespace BMIcalculator
{
public partial class MainForm : Form
{
private string name = string.Empty; // instance variable
BMIcalculator bmiCalc = new BMIcalculator();
BmrCalculator bmrCalc = new BmrCalculator();
public MainForm()
{
InitializeComponent();
InitializeGUI();
}
private void InitializeGUI()
{
rbtnMetric.Checked = true;
lblBmr.Text = String.Empty;
}
private void MainForm_Load(object sender, EventArgs e)
{
CenterToScreen();
}
#region BMICalculator
private void UpdateHeightText()
{
if(rbtnMetric.Checked == true)
{
lblHeight.Text = "Height (Cm)";
lblWeight.Text = "Weight (Kg)";
}
else
{
lblHeight.Text = "Height (Ft)";
lblWeight.Text = "Weight (lbs)";
}
}
private void rbtnMetric_CheckedChanged(object sender, EventArgs e)
{
UpdateHeightText();
}
private void rbtnImperial_CheckedChanged(object sender, EventArgs e)
{
UpdateHeightText();
}
private bool ReadInputBMI()
{
ReadUnit();
bool weightOK = ReadWeight();
bool heightOK = ReadHeight();
return weightOK && heightOK;
}
private void ReadUnit() // this void looks which one is checked
{
if(rbtnMetric.Checked)
{
bmiCalc.setUnit(UnitTypes.Metric);
}
else
{
bmiCalc.setUnit(UnitTypes.Imperial);
}
}
private bool ReadWeight()
{
double weight = 0.0;
bool ok = double.TryParse(txtWeight.Text, out weight);
if (!ok)
{
MessageBox.Show("Invalid weight value , error");
}
bmiCalc.setWeight(weight);
return ok;
}
private bool ReadHeight()
{
double height = 0.0;
bool ok = double.TryParse(txtCmFt.Text, out height);
if (!ok)
{
MessageBox.Show("Invalid height value , error");
}
double inch = 0.0;
// cm -> m ft -> inches
if(bmiCalc.getUnit() == UnitTypes.Metric)
{
height = height / 100; // cm -> m
}
else
{
height = height * 12.0 + inch; // ft -> inch
}
bmiCalc.setHeight(height);
return ok;
}
#endregion
#region BMRCalculator
private void UpdateGenderStatus()
{
if(rbtnFemale.Checked)
{
bmrCalc.SetGender(Gender.Female);
}
else
{
bmrCalc.SetGender(Gender.Male);
}
}
private void rbtnFemale_CheckedChanged(object sender, EventArgs e)
{
UpdateGenderStatus();
}
private void rbtnMale_CheckedChanged(object sender, EventArgs e)
{
UpdateGenderStatus();
}
private void ReadAge()
{
int age;
bool ok = int.TryParse(txtAge.Text , out age);
if(!ok)
{
MessageBox.Show("Error Wrong Age");
}
else
{
bmrCalc.SetAge(age);
}
}
#endregion
private void btnCalculateBMR_Click(object sender, EventArgs e)
{
double weight = double.Parse(txtWeight.Text);
double height = double.Parse(txtCmFt.Text);
bmrCalc.setWeight(weight);
bmrCalc.setHeight(height);
ReadAge();
//bmrCalc.CalculateBMR();
lblBmr.Text = bmrCalc.CalculateBMR().ToString();
}
}
}
designer:
namespace BMIcalculator
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.lblHeight = new System.Windows.Forms.Label();
this.txtCmFt = new System.Windows.Forms.TextBox();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.rbtnMetric = new System.Windows.Forms.RadioButton();
this.lblWeight = new System.Windows.Forms.Label();
this.txtWeight = new System.Windows.Forms.TextBox();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.btnCalculateBMR = new System.Windows.Forms.Button();
this.groupBox6 = new System.Windows.Forms.GroupBox();
this.lblBmr = new System.Windows.Forms.Label();
this.txtAge = new System.Windows.Forms.TextBox();
this.lblAge = new System.Windows.Forms.Label();
this.groupBox5 = new System.Windows.Forms.GroupBox();
this.rbtnMale = new System.Windows.Forms.RadioButton();
this.rbtnFemale = new System.Windows.Forms.RadioButton();
this.groupBox1.SuspendLayout();
this.groupBox4.SuspendLayout();
this.groupBox6.SuspendLayout();
this.groupBox5.SuspendLayout();
this.SuspendLayout();
//
// lblHeight
//
this.lblHeight.AutoSize = true;
this.lblHeight.Location = new System.Drawing.Point(27, 39);
this.lblHeight.Name = "lblHeight";
this.lblHeight.Size = new System.Drawing.Size(54, 20);
this.lblHeight.TabIndex = 1;
this.lblHeight.Text = "Height";
//
// txtCmFt
//
this.txtCmFt.Location = new System.Drawing.Point(165, 32);
this.txtCmFt.Name = "txtCmFt";
this.txtCmFt.Size = new System.Drawing.Size(51, 27);
this.txtCmFt.TabIndex = 3;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.rbtnMetric);
this.groupBox1.Location = new System.Drawing.Point(319, 23);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(163, 88);
this.groupBox1.TabIndex = 6;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Unit";
//
// rbtnMetric
//
this.rbtnMetric.AutoSize = true;
this.rbtnMetric.Location = new System.Drawing.Point(26, 35);
this.rbtnMetric.Name = "rbtnMetric";
this.rbtnMetric.Size = new System.Drawing.Size(121, 24);
this.rbtnMetric.TabIndex = 0;
this.rbtnMetric.TabStop = true;
this.rbtnMetric.Text = "Metric(kg,cm)";
this.rbtnMetric.UseVisualStyleBackColor = true;
this.rbtnMetric.CheckedChanged += new System.EventHandler(this.rbtnMetric_CheckedChanged);
//
// lblWeight
//
this.lblWeight.AutoSize = true;
this.lblWeight.Location = new System.Drawing.Point(27, 77);
this.lblWeight.Name = "lblWeight";
this.lblWeight.Size = new System.Drawing.Size(56, 20);
this.lblWeight.TabIndex = 9;
this.lblWeight.Text = "Weight";
//
// txtWeight
//
this.txtWeight.Location = new System.Drawing.Point(165, 70);
this.txtWeight.Name = "txtWeight";
this.txtWeight.Size = new System.Drawing.Size(125, 27);
this.txtWeight.TabIndex = 10;
//
// groupBox4
//
this.groupBox4.Controls.Add(this.btnCalculateBMR);
this.groupBox4.Controls.Add(this.groupBox6);
this.groupBox4.Controls.Add(this.txtAge);
this.groupBox4.Controls.Add(this.lblAge);
this.groupBox4.Controls.Add(this.groupBox5);
this.groupBox4.Location = new System.Drawing.Point(27, 130);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(392, 314);
this.groupBox4.TabIndex = 15;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "BMR calculator";
//
// btnCalculateBMR
//
this.btnCalculateBMR.Location = new System.Drawing.Point(68, 274);
this.btnCalculateBMR.Name = "btnCalculateBMR";
this.btnCalculateBMR.Size = new System.Drawing.Size(212, 29);
this.btnCalculateBMR.TabIndex = 4;
this.btnCalculateBMR.Text = "Calculate BMR";
this.btnCalculateBMR.UseVisualStyleBackColor = true;
this.btnCalculateBMR.Click += new System.EventHandler(this.btnCalculateBMR_Click);
//
// groupBox6
//
this.groupBox6.Controls.Add(this.lblBmr);
this.groupBox6.Location = new System.Drawing.Point(177, 55);
this.groupBox6.Name = "groupBox6";
this.groupBox6.Size = new System.Drawing.Size(185, 213);
this.groupBox6.TabIndex = 3;
this.groupBox6.TabStop = false;
this.groupBox6.Text = "how many calories you need";
//
// lblBmr
//
this.lblBmr.AutoSize = true;
this.lblBmr.Location = new System.Drawing.Point(45, 67);
this.lblBmr.Name = "lblBmr";
this.lblBmr.Size = new System.Drawing.Size(58, 20);
this.lblBmr.TabIndex = 5;
this.lblBmr.Text = "label10";
//
// txtAge
//
this.txtAge.Location = new System.Drawing.Point(98, 182);
this.txtAge.Name = "txtAge";
this.txtAge.Size = new System.Drawing.Size(50, 27);
this.txtAge.TabIndex = 2;
//
// lblAge
//
this.lblAge.AutoSize = true;
this.lblAge.Location = new System.Drawing.Point(31, 185);
this.lblAge.Name = "lblAge";
this.lblAge.Size = new System.Drawing.Size(36, 20);
this.lblAge.TabIndex = 1;
this.lblAge.Text = "Age";
//
// groupBox5
//
this.groupBox5.Controls.Add(this.rbtnMale);
this.groupBox5.Controls.Add(this.rbtnFemale);
this.groupBox5.Location = new System.Drawing.Point(17, 42);
this.groupBox5.Name = "groupBox5";
this.groupBox5.Size = new System.Drawing.Size(131, 125);
this.groupBox5.TabIndex = 0;
this.groupBox5.TabStop = false;
this.groupBox5.Text = "Gender";
//
// rbtnMale
//
this.rbtnMale.AutoSize = true;
this.rbtnMale.Location = new System.Drawing.Point(14, 63);
this.rbtnMale.Name = "rbtnMale";
this.rbtnMale.Size = new System.Drawing.Size(63, 24);
this.rbtnMale.TabIndex = 1;
this.rbtnMale.TabStop = true;
this.rbtnMale.Text = "Male";
this.rbtnMale.UseVisualStyleBackColor = true;
this.rbtnMale.CheckedChanged += new System.EventHandler(this.rbtnMale_CheckedChanged);
//
// rbtnFemale
//
this.rbtnFemale.AutoSize = true;
this.rbtnFemale.Location = new System.Drawing.Point(14, 33);
this.rbtnFemale.Name = "rbtnFemale";
this.rbtnFemale.Size = new System.Drawing.Size(78, 24);
this.rbtnFemale.TabIndex = 0;
this.rbtnFemale.TabStop = true;
this.rbtnFemale.Text = "Female";
this.rbtnFemale.UseVisualStyleBackColor = true;
this.rbtnFemale.CheckedChanged += new System.EventHandler(this.rbtnFemale_CheckedChanged);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(512, 484);
this.Controls.Add(this.groupBox4);
this.Controls.Add(this.txtWeight);
this.Controls.Add(this.lblWeight);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.txtCmFt);
this.Controls.Add(this.lblHeight);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
this.MaximizeBox = false;
this.Name = "MainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Form1";
this.Load += new System.EventHandler(this.MainForm_Load);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
this.groupBox6.ResumeLayout(false);
this.groupBox6.PerformLayout();
this.groupBox5.ResumeLayout(false);
this.groupBox5.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private Label lblHeight;
private TextBox txtCmFt;
private GroupBox groupBox1;
private RadioButton rbtnMetric;
private Label lblWeight;
private TextBox txtWeight;
private GroupBox groupBox4;
private Button btnCalculateBMR;
private GroupBox groupBox6;
private TextBox txtAge;
private Label lblAge;
private GroupBox groupBox5;
private RadioButton rbtnMale;
private RadioButton rbtnFemale;
private Label lblBmr;
}
}
The problem is i cant acess another class by creating new BMIcalculator(); because then its empty or 0.
So my question is how can i access the getter from the BMIcalculator without creating new object. I want to get access to instance variables height and weigh and then use it in Bmrcalculator.
I have very similar problem to this one: Call Methods from another class c#
but i still cant solve it. I began programming 2 weeks ago, sorry if its an obvious question.

How to do I scroll to side with buttons in WinForms in Visual Studio C#?

I know how to scroll vertically/horizontally with buttons but I am not able to figure out how to scroll towards Left/Right.
What I want is that when I click the button LeftScrlBtn I should scroll to left and when I click the RightScrlBtn I should scroll to right.
My FlowLayoutPanel's AutoScroll property is set to false because I don't want the scroll bar, only the buttons.
Edit
To make this post more understandable, here is the code:
using System;
using [...];
//rest of the code
private void LeftScrlBtn_Click(object sender, EventArgs e) {
//Code to scroll to Left
}
private void RightScrlBtn_Click(object sender, EventArgs e) {
//Code to scroll to Right
}
//I want to know the code to scroll left and the code to scroll right
Note
I wanted to tell that this question didn't help me.
You can try the following code to scroll the FlowLayoutPanel by using the button.
public Form1()
{
InitializeComponent();
// need to disable AutoScroll, otherwise disabling the horizontal scrollbar doesn't work
flowLayoutPanel.AutoScroll = false;
// disable horizontal scrollbar
flowLayoutPanel.HorizontalScroll.Enabled = false;
}
public int scrollValue = 0;
public int ScrollValue
{
get
{
return scrollValue;
}
set
{
scrollValue = value;
if (scrollValue < flowLayoutPanel1.HorizontalScroll.Minimum)
{
scrollValue = flowLayoutPanel1.HorizontalScroll.Minimum;
}
if (scrollValue > flowLayoutPanel1.HorizontalScroll.Maximum)
{
scrollValue = flowLayoutPanel1.HorizontalScroll.Maximum;
}
flowLayoutPanel1.HorizontalScroll.Value = scrollValue;
flowLayoutPanel1.PerformLayout();
}
}
private void btnleft_Click(object sender, EventArgs e)
{
ScrollValue -= flowLayoutPanel1.HorizontalScroll.LargeChange;
}
private void btnright_Click(object sender, EventArgs e)
{
ScrollValue += flowLayoutPanel1.HorizontalScroll.LargeChange;
}
private void button1_Click(object sender, EventArgs e)
{
flowLayoutPanel1.Controls.Add(new Button() { Width = 67, Height = flowLayoutPanel1.Height});
}
Result:
You could place all your controls in a panel that is transparent and is overflowing over the form's bounds (eg. if form is 500px in width and 600px in height you can make the panel be wider than the form and place controls in there). Leave some space under the panel and add your buttons there.
To the LeftScrlBtn_Click block of code add the following: this.panel1.Left--;
Add this to the RightScrlBtn_Click: this.panel1.Left++;
Of course, you can change the incremention value of the panels so it would scroll faster. Just replace ++ with +=5 or -- with -=5 to scroll 5 pixels on click, per example.
Here is a code sample I did (goes into Form1.cs) :
using System.Collections.Generic;
using System.Windows.Forms;
namespace StackOfAnswer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Scrolling left
this.panel1.Left--;
}
private void button2_Click(object sender, EventArgs e)
{
//Scrolling right
this.panel1.Left++;
}
}
}
Here is the code that goes into Form1.Designer.cs :
namespace StackOfAnswer
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.panel1 = new System.Windows.Forms.Panel();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.BackColor = System.Drawing.Color.Black;
this.panel1.Controls.Add(this.label1);
this.panel1.Location = new System.Drawing.Point(-3, -1);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(904, 422);
this.panel1.TabIndex = 0;
//
// button1
//
this.button1.Location = new System.Drawing.Point(24, 427);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 1;
this.button1.Text = "scroll left";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(713, 427);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 1;
this.button2.Text = "scroll right";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.ForeColor = System.Drawing.Color.White;
this.label1.Location = new System.Drawing.Point(24, 136);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(1561, 13);
this.label1.TabIndex = 0;
this.label1.Text = " example example example example example example example example example example example example example example example example example example example example example example example ";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.panel1);
this.Name = "Form1";
this.Text = "Form1";
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
}
}
This should do it.

Programmatically created form is blank

I'm trying to create a pop up to notify users of a successful action. It is supposed to be visible for a couple seconds and fade away on its own. To do this, I've created a form that inherits from Form and sets the ShowWithoutActivation property to true, as well as a static class to control its construction and manipulate its opacity.
The problem is that when the new form is created, it has the correct size and initial opacity, but is completely blank. The only child control, a docked (Fill) label does not show. The Background/Foreground Color properties I set in the designer seem to be ignored in favor of default values as well. The Form fades and closes as intended.
The form itself:
public partial class TempForm : Form
{
protected override bool ShowWithoutActivation
{
get { return true; }
}
public TempForm(string message)
{
InitializeComponent();
messageLabel.Text = message;
}
private TempForm() { }
}
The static class that creates it:
public static class FadeAwayNotifier
{
public static void DisplayFadeNotification(Point parentLocation, string message)
{
Task t = Task.Factory.StartNew(() =>
{
int fadeDelay = 2000;
int animationLength = 1000;
int threadRestLength = 20;
Form popUp = buildForm(parentLocation, message);
popUp.Show();
int opacityIncrements = (animationLength / threadRestLength);
double opacityDecrementAmount = popUp.Opacity / opacityIncrements;
Thread.Sleep(fadeDelay);
for (int i = 0; i < opacityIncrements; i++)
{
Thread.Sleep(threadRestLength);
popUp.Opacity -= opacityDecrementAmount;
}
popUp.Close();
});
}
private static Form buildForm(Point startLocation, string text)
{
TempForm returnForm = new TempForm(text);
returnForm.Location = startLocation;
returnForm.messageLabel.Text = text;
returnForm.BackColor = Color.Black;
returnForm.ForeColor = Color.White;
return returnForm;
}
}
And, if it's helpful, here is the designer code for TempForm:
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.messageLabel = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// messageLabel
//
this.messageLabel.BackColor = System.Drawing.Color.Black;
this.messageLabel.Dock = System.Windows.Forms.DockStyle.Fill;
this.messageLabel.Font = new System.Drawing.Font("Cambria", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.messageLabel.ForeColor = System.Drawing.Color.White;
this.messageLabel.Location = new System.Drawing.Point(0, 0);
this.messageLabel.Name = "messageLabel";
this.messageLabel.Size = new System.Drawing.Size(254, 81);
this.messageLabel.TabIndex = 0;
this.messageLabel.Text = "Message";
this.messageLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// TempForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Black;
this.ClientSize = new System.Drawing.Size(254, 81);
this.Controls.Add(this.messageLabel);
this.Font = new System.Drawing.Font("Cambria", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ForeColor = System.Drawing.Color.White;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.Name = "TempForm";
this.Opacity = 0.8D;
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "tempForm";
this.TopMost = true;
this.ResumeLayout(false);
}
#endregion
public System.Windows.Forms.Label messageLabel;
For those asking how the method is being called:
private void btnUpdate_Click(object sender, EventArgs e)
{
Cursor.Current = Cursors.WaitCursor;
/* Input validation here */
if (cmbBox.SelectedValue != null)
{
updateMethod(a, b....out errorMessage);
if (String.IsNullOrEmpty(errorMessage))
FadeAwayNotifier.DisplayFadeNotification(this.Location, "Rule successfully updated");
}
else
MessageBox.Show("A selection must be made in order to update");
Cursor.Current = Cursors.Default;
}
I've searched around but haven't seen anything that seemed to relate to the situation. I'm happy to be corrected if I missed something, though.
Why is the form that's created completely blank?
Your form is blank because you are trying to show it inside Task.Factory.StartNew().
Task.Factory.StartNew() runs code inside it asynchronous which is for some reason problem for form.Show() method.
Solution for this is to instead of Task t = Task.Factory.StartNew(... use Task t = new Tast(.... and then after you created task you run it with t.RunSynchronously(). This way it will work.
How i am displaying temp forms is:
Create temporary form create new blank winform (through vs solution explorer)
Add code like this:
public partial class TempForm : Form
{
System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
double seconds = 3;
public TempForm(int secs, string text)
{
InitializeComponent();
//Custom property to dock it to down right to the screen
Rectangle workingArea = Screen.GetWorkingArea(this);
this.Location = new Point(workingArea.Right - Size.Width, workingArea.Bottom - Size.Height);
t = new System.Windows.Forms.Timer();
this.seconds = (secs != 0) ? secs : this.seconds;
richTextBox1.Text = text;
}
private void TempForm_Load(object sender, EventArgs e)
{
t.Interval = (int)(seconds * 1000);
t.Tick += new EventHandler(CloseForm);
t.Start();
}
private void CloseForm(object sender, EventArgs e)
{
this.Close();
this.Dispose();
}
public static void Show(int seconds, string text)
{
TempForm tf = new TempForm(seconds, text);
tf.Show();
}
}
To call it just use TempForm.Show(10, "SomeText");
Also make it look better (not like standard form) so it looks like this:

Building a typing game in C#

a few days back i started reading Head first C#, i use visual c# 2015 for building code and learning C# but however the book is based on visual studio 2010, i never ran into any problem so far while learning until i ran into this exercise when i have to build a typing game, i followed all the procedure as mentioned by the book and built it with no errors. but in the end when i run the code a key press from the keyboard should initialize the game but nothing seems t o start the game not even a mouse click or even from virtual keyboard.
Here is the code
namespace WindowsFormsApplication15{
public partial class Form1 : Form
{
Random random = new Random();
Stats stats = new Stats();
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
listBox1.Items.Add((Keys)random.Next(65, 70));
if (listBox1.Items.Count > 7)
{
listBox1.Items.Clear();
listBox1.Items.Add("Game over");
timer1.Stop();
}
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (listBox1.Items.Contains(e.KeyCode))
{
listBox1.Items.Remove(e.KeyCode);
listBox1.Refresh();
if (timer1.Interval > 400)
timer1.Interval -= 10;
if (timer1.Interval > 250)
timer1.Interval -= 7;
if (timer1.Interval > 100)
timer1.Interval -= 2;
difficultyProgressBar.Value = 800 - timer1.Interval;
stats.Update(true);
}
else
{
stats.Update(false);
}
correctLabel.Text = "Correct:" + stats.Correct;
missedLabel.Text = "Missed:" + stats.Missed;
totalLabel.Text = "Total:" + stats.Total;
accuracyLabel.Text = "Accuracy:" + stats.Accuracy + "%";
}
}
}
class for the code
namespace WindowsFormsApplication15{
class Stats
{
public int Total = 0;
public int Missed = 0;
public int Correct = 0;
public int Accuracy = 0;
public void Update(bool correctKey)
{
Total++;
if (!correctKey)
{
Missed++;
}
else
{
Correct++;
}
Accuracy = 100 * Correct / (Missed + Correct);
}
}
}
Form designer code
namespace WindowsFormsApplication15{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.listBox1 = new System.Windows.Forms.ListBox();
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.correctLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.missedLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.totalLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.accuracyLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
this.difficultyProgressBar = new System.Windows.Forms.ToolStripProgressBar();
this.statusStrip1.SuspendLayout();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.listBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 80.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.listBox1.FormattingEnabled = true;
this.listBox1.ItemHeight = 120;
this.listBox1.Location = new System.Drawing.Point(0, 0);
this.listBox1.MultiColumn = true;
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(887, 261);
this.listBox1.TabIndex = 0;
//
// timer1
//
this.timer1.Interval = 800;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
//
// statusStrip1
//
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.correctLabel,
this.missedLabel,
this.totalLabel,
this.accuracyLabel,
this.toolStripStatusLabel1,
this.difficultyProgressBar});
this.statusStrip1.Location = new System.Drawing.Point(0, 239);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(887, 22);
this.statusStrip1.SizingGrip = false;
this.statusStrip1.TabIndex = 1;
this.statusStrip1.Text = "statusStrip1";
//
// correctLabel
//
this.correctLabel.Name = "correctLabel";
this.correctLabel.Size = new System.Drawing.Size(58, 17);
this.correctLabel.Text = "Correct: 0";
//
// missedLabel
//
this.missedLabel.Name = "missedLabel";
this.missedLabel.Size = new System.Drawing.Size(56, 17);
this.missedLabel.Text = "Missed: 0";
//
// totalLabel
//
this.totalLabel.Name = "totalLabel";
this.totalLabel.Size = new System.Drawing.Size(45, 17);
this.totalLabel.Text = "Total: 0";
//
// accuracyLabel
//
this.accuracyLabel.Name = "accuracyLabel";
this.accuracyLabel.Size = new System.Drawing.Size(78, 17);
this.accuracyLabel.Text = "Accuracy: 0%";
//
// toolStripStatusLabel1
//
this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
this.toolStripStatusLabel1.Size = new System.Drawing.Size(533, 17);
this.toolStripStatusLabel1.Spring = true;
this.toolStripStatusLabel1.Text = "Difficulty";
this.toolStripStatusLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// difficultyProgressBar
//
this.difficultyProgressBar.Name = "difficultyProgressBar";
this.difficultyProgressBar.Size = new System.Drawing.Size(100, 16);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(887, 261);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.listBox1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "Form1";
this.Text = "Form1";
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Timer timer1;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel correctLabel;
private System.Windows.Forms.ToolStripStatusLabel missedLabel;
private System.Windows.Forms.ToolStripStatusLabel totalLabel;
private System.Windows.Forms.ToolStripStatusLabel accuracyLabel;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
private System.Windows.Forms.ToolStripProgressBar difficultyProgressBar;
}
}
I just started learning C# and working with visual studio this month, i don't know much about programming
My guess is the problem lies some where with the KeyDown event
In all of that code I cannot see where timer1 is started - try adding
timer1.Start();
after InitializeComponent();
The problem is simple - your input focus is on the listbox. The guy who wrote the sample probably didn't test it all that much, or you didn't follow the procedure precisely enough :)
To make sure the form receives key press on a child control, you need to set the form's KeyPreview property to true.
Also, as PaulF noted, you never start the timer. The simplest solution is to set Enabled to true.
I'm late to this, but here's what I've got. I'm working through the same book and ran into the same problem, which is that the instructions tell you to set the listbox font at 72pt size. This makes the letters too large to display properly in the listbox on the form, and the Dock Fill property (or some other property, I'm new at C#) causes the ListBox (and its contents) to not display on the form during runtime.
The fix was to reduce ListBox1's font size down to the next size down, at 48pt.
I had the same problem and I had to set the timer to start or enabled and also set the font size to 48pt.
Add one of these lines in Form1.cs underneath InitializeComponent().
this.timer1.Enabled = true;
this.timer1.Start();

c# label not updating

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:
public class UpdatableLabel : Button
{
public UpdatableLabel() : base()
{
FlatAppearance.BorderSize = 0;
FlatStyle = System.Windows.Forms.FlatStyle.Flat;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Pen pen = new Pen(FlatAppearance.BorderColor, 1);
Rectangle rectangle = new Rectangle(0, 0, Size.Width - 1, Size.Height - 1);
e.Graphics.DrawRectangle(pen, rectangle);
}
}
Now my "label" is updated.

Categories

Resources