I am trying to use the selectedItem command to see what has been selected in the list box and then use the switch to set the activityLevel variable depending on what has been selected. I then need to be able to multiply that variable by the BMR variable that is set as a double. Then the result is displayed in a label.
string activityLevel = lstActivityLevel.SelectedItem.ToString();
switch (activityLevel)
{
case 1:
activityLevel = Convert.ToInt32(ACTIVTY_LEVEL2);
break;
case 2:
activityLevel = Convert.ToInt32(ACTIVTY_LEVEL3);
break;
case 3:
activityLevel = Convert.ToInt32(ACTIVTY_LEVEL4);
break;
case 4:
activityLevel = Convert.ToInt32(ACTIVTY_LEVEL5);
break;
}
//Display BMR in label
lblBMRResult.Text = (BMR*activityLevel).ToString();
You can use SelectedIndex, then each item of lstActivityLevel set to number from 0 to 4:
double activityLevel = 0;
switch (lstActivityLevel.SelectedIndex)
{
case 0:
activityLevel = ACTIVTY_LEVEL1;
break;
case 1:
activityLevel = ACTIVTY_LEVEL2;
break;
case 2:
activityLevel = ACTIVTY_LEVEL3;
break;
case 3:
activityLevel = ACTIVTY_LEVEL4;
break;
case 4:
activityLevel = ACTIVTY_LEVEL5;
break;
}
lblBMRResult.Text = (BMR * activityLevel).ToString();
You convert SelectedItem value to string. And value 1 (int) is not the same as "1" (string)... So, you have to change your switch statement to:
switch (activityLevel)
{
case "1":
blah, blah...
break;
}
and so on..
Or do not call ToString() on SelectedItem.
Or you can use SelectedIndex instead of SelectedItem..
Related
I'm making a memory game in C#. It has 10 pairs of cards, total 20. It's supposed to work like this: When pressing the Start button, the game shuffles randomly the cards and reveals all cards. After 3 seconds it flips them. Then, the player has to find all pairs.
I'm having a problem with shuffling. I wrote this code. It's being executed when I press the Start button:
foreach (String icon in icons)
{
int x1 = r.Next(1, 21);
int x2 = r.Next(1, 21);
if (!num.Contains(x1))
{
num.Add(x1);
}
else
{
do
{
x1 = r.Next(1, 21);
} while (!num.Contains(x1));
num.Add(x1);
}
if (!num.Contains(x2))
{
num.Add(x2);
}
else
{
do
{
x2 = r.Next(1, 21);
} while (!num.Contains(x2));
num.Add(x2);
}
switch (x1)
{
case 1:
pictureBox1.Image = Image.FromFile(icon);
break;
case 2:
pictureBox2.Image = Image.FromFile(icon);
break;
case 3:
pictureBox3.Image = Image.FromFile(icon);
break;
case 4:
pictureBox4.Image = Image.FromFile(icon);
break;
case 5:
pictureBox5.Image = Image.FromFile(icon);
break;
case 6:
pictureBox6.Image = Image.FromFile(icon);
break;
case 7:
pictureBox7.Image = Image.FromFile(icon);
break;
case 8:
pictureBox8.Image = Image.FromFile(icon);
break;
case 9:
pictureBox9.Image = Image.FromFile(icon);
break;
case 10:
pictureBox10.Image = Image.FromFile(icon);
break;
case 11:
pictureBox11.Image = Image.FromFile(icon);
break;
case 12:
pictureBox12.Image = Image.FromFile(icon);
break;
case 13:
pictureBox13.Image = Image.FromFile(icon);
break;
case 14:
pictureBox14.Image = Image.FromFile(icon);
break;
case 15:
pictureBox15.Image = Image.FromFile(icon);
break;
case 16:
pictureBox16.Image = Image.FromFile(icon);
break;
case 17:
pictureBox17.Image = Image.FromFile(icon);
break;
case 18:
pictureBox18.Image = Image.FromFile(icon);
break;
case 19:
pictureBox19.Image = Image.FromFile(icon);
break;
case 20:
pictureBox20.Image = Image.FromFile(icon);
break;
}
switch (x2)
{
case 1:
pictureBox1.Image = Image.FromFile(icon);
break;
case 2:
pictureBox2.Image = Image.FromFile(icon);
break;
case 3:
pictureBox3.Image = Image.FromFile(icon);
break;
case 4:
pictureBox4.Image = Image.FromFile(icon);
break;
case 5:
pictureBox5.Image = Image.FromFile(icon);
break;
case 6:
pictureBox6.Image = Image.FromFile(icon);
break;
case 7:
pictureBox7.Image = Image.FromFile(icon);
break;
case 8:
pictureBox8.Image = Image.FromFile(icon);
break;
case 9:
pictureBox9.Image = Image.FromFile(icon);
break;
case 10:
pictureBox10.Image = Image.FromFile(icon);
break;
case 11:
pictureBox11.Image = Image.FromFile(icon);
break;
case 12:
pictureBox12.Image = Image.FromFile(icon);
break;
case 13:
pictureBox13.Image = Image.FromFile(icon);
break;
case 14:
pictureBox14.Image = Image.FromFile(icon);
break;
case 15:
pictureBox15.Image = Image.FromFile(icon);
break;
case 16:
pictureBox16.Image = Image.FromFile(icon);
break;
case 17:
pictureBox17.Image = Image.FromFile(icon);
break;
case 18:
pictureBox18.Image = Image.FromFile(icon);
break;
case 19:
pictureBox19.Image = Image.FromFile(icon);
break;
case 20:
pictureBox20.Image = Image.FromFile(icon);
break;
}
There is also an auxiliary list "num" and a list "icons", which contains the names of the icons' files.
List<int> num = new List<int>();
List<String> icons = new List<String>() { "agelada.png", "elefantas.png", "gata.png", "gatopardos.png", "kamilopardali.png", "liontari.png", "lykos.png", "skylos.png", "tigris.png", "zebra.png" };
This code is supposed to work like this:
~It generates two random numbers, from 1 to 20 (the game has 20 cards), and stores them into x1 and x2 respectively.
~For each icon, member of the "icons" list: If x1 isn't found in the list num, it gets added in it. If x1 is found, a new number is being generated, until generating one that isn't in "num". Then it gets stored in "num". Same for x2. This process repeats for all the member of the list "icons".
~Then, depending of the randomly generated numbers, the icon gets inserted into the respective pictureBoxes, for example, if the numbers are 6 and 17, the picture is entered into pictureBox6 and pictureBox17.
The goal of this process is to make sure that all 10 pictures are displayed exactly twice, to make pairs.
However, I have a problem. When I click on Start, not all cards are flipped (The question mark is the "back side" of the cards). It looks like this:
Picture
It's supposed to show animal pictures in all cards.
Any ideas?
In addition to the recommendations around managing the PictureBox controls in arrays, I would recommend you change the line (not shown) where you create the Random object to something like this:
Random r = new Random(10);
Setting the seed like this while you're debugging will let you predict the output, and as you step through code from one run to the next run, it's easier to follow what's happening.
That said, if you stepped through this code:
do
{
x1 = r.Next(1, 21);
} while (!num.Contains(x1));
num.Add(x1);
If you stopped the code on adding the value to your array, you would have seen the value already exists in the array, which is the opposite of the intended action. That means your loop is exiting at the wrong time.
In this case, it's because your check is the opposite logic of what it should be, you want to keep running through this loop while the value is in the array. In other words, changing both loops to look like this:
do
{
x1 = r.Next(1, 21);
} while (num.Contains(x1));
num.Add(x1);
You will end up filling up your array with 20 unique values.
I am trying to make a minesweeper game using Windows Application. I would like to use a switch inside a method.
The problem:
public void switcher()
{
switch (x)
{
case 0:
A1.BackgroundImage = Image.FromFile("empty.jpg"); // look at A1
break;
case 1:
A1.BackgroundImage = Image.FromFile("1.jpg");
break;
case 2:
A1.BackgroundImage = Image.FromFile("2.jpg");
break;
case 3:
A1.BackgroundImage = Image.FromFile("3.jpg");
break;
case 4:
A1.BackgroundImage = Image.FromFile("4.jpg");
break;
case 5:
A1.BackgroundImage = Image.FromFile("5.jpg");
break;
case 6:
A1.BackgroundImage = Image.FromFile("6.jpg");
break;
case 7:
A1.BackgroundImage = Image.FromFile("7.jpg");
break;
case 8:
A1.BackgroundImage = Image.FromFile("8.jpg");
break;
}
}
As you can see, each of them says "A1. ....." A1 is my first button's name, but there are many other buttons as well. Is there a way I can refer to the button's properties, such as background image, without having to use its name? It would make programming so much easier.
Here's a simplified part of the button, if it helps:
private void A1_Click(object sender, EventArgs e) // < - I want to refer to this without using A1 name.
{
x = bombcount[0, 0];
switcher();
}
edit: One of the answers worked. I don't know much about these things, but I'll try to learn more about them! Thank you!
You need to refactor this code altogether. Don't rely on private members such as x like that, use method parameters:
private void SetButtonImage(Button button, int number)
{
string imagePath;
if (number == 0)
{
imagePath = "empty.jpg";
}
else
{
imagePath = number + ".jpg";
}
button.BackgroundImage = Image.FromFile(imagePath);
}
Then call it like this:
private void Button_Click(object sender, EventArgs e)
{
var button = sender as Button;
int number = bombcount[0, 0];
SetButtonImage(button, number);
}
Now you can hook up all button click events to that single event handler, and you can remove the x member, and you can remove the switch altogether.
Get a reference in switcher to the button being clicked like this:
private void A1_Click(object sender, EventArgs e)
{
Button myB = (Button) sender;
x = bombcount[0,0];
switcher(myB);
}
private void switcher(Button button)
{
switch (x)
{
case 0:
button.BackgroundImage = Image.FromFile("empty.jpg"); // look at A1
break;
case 1:
button.BackgroundImage = Image.FromFile("1.jpg");
break;
case 2:
button.BackgroundImage = Image.FromFile("2.jpg");
break;
case 3:
button.BackgroundImage = Image.FromFile("3.jpg");
break;
case 4:
button.BackgroundImage = Image.FromFile("4.jpg");
break;
case 5:
button.BackgroundImage = Image.FromFile("5.jpg");
break;
case 6:
button.BackgroundImage = Image.FromFile("6.jpg");
break;
case 7:
button.BackgroundImage = Image.FromFile("7.jpg");
break;
case 8:
button.BackgroundImage = Image.FromFile("8.jpg");
break;
}
}
I have a method that appends or inserts characters to the text of either a combo box or textbox depending on what was last focused on. I am using buttons to pass in the character as a parameter, Using a keyboard or sendkeys is not an option. When my method appends or inserts characters into a textbox the result is as expected however when the same method is applied to a combobox the text of the combobox is highlighted. Obviously this is not the functionality im looking for and I believe this is stopping the autocomplete mode from working correctly.
Why is the combobox behaving differently than the textbox?
The code:
private void createText(string lowerCaseChar, string upperCaseChar)
{
Control FocusedTextComboBox;
switch (lastTextComboBoxFocused)
{
case 54:
FocusedTextComboBox = SearchTextBox;
break;
case 4:
FocusedTextComboBox = VendorComboBox;
break;
case 6:
FocusedTextComboBox = SectionComboBox;
break;
case 5:
FocusedTextComboBox = DeptComboBox;
break;
default:
FocusedTextComboBox = SearchTextBox;
break;
}
if (FocusedTextComboBox is TextBox)
{
TextBox FocusedTextBox = (TextBox)FocusedTextComboBox;
int SelectionStartNumber = FocusedTextBox.SelectionStart;
switch (shift)
{
case true:
FocusedTextBox.Text = FocusedTextBox.Text.Insert(FocusedTextBox.SelectionStart, upperCaseChar);
break;
case false:
FocusedTextComboBox.Text = FocusedTextComboBox.Text.Insert(FocusedTextBox.SelectionStart, lowerCaseChar);
break;
}
FocusedTextBox.SelectionStart = SelectionStartNumber + 1;
FocusedTextBox.Focus();
}
else
{
ComboBox FocusedComboBox = (ComboBox)FocusedTextComboBox;
if (FocusedComboBox.SelectionStart == 0 && FocusedComboBox.Text != "")
{
switch (shift)
{
case true:
FocusedComboBox.Text += upperCaseChar;
break;
case false:
FocusedComboBox.Text += lowerCaseChar;
break;
}
}
else
{
int SelectionStartNumber = FocusedComboBox.SelectionStart;
switch (shift)
{
case true:
FocusedComboBox.Text = FocusedComboBox.Text.Insert(FocusedComboBox.SelectionStart, upperCaseChar);
break;
case false:
FocusedTextComboBox.Text = FocusedTextComboBox.Text.Insert(FocusedComboBox.SelectionStart, lowerCaseChar);
break;
}
FocusedComboBox.SelectionStart = SelectionStartNumber + 1;
}
FocusedComboBox.Focus();
}
}
I think setting focus back to the combobox is highlighting the text, move FousedCombox.Focus() to before assigning text to combobox.
I have a label on a form that displays a float (_DataFloat) with a variable (_Digits) that sets the number of digits to show to the right of the decimal point. Assuming that _Digits can be any value from 0 through 6, is there a better way of formatting the text other than using a switch statement as below?
switch (_Digits) {
case 0:
label1.Text = _DataFloat.ToString("0");
break;
case 1:
label1.Text = _DataFloat.ToString("0.0");
break;
case 2:
label1.Text = _DataFloat.ToString("0.00");
break;
case 3:
label1.Text = _DataFloat.ToString("0.000");
break;
case 4:
label1.Text = _DataFloat.ToString("0.0000");
break;
case 5:
label1.Text = _DataFloat.ToString("0.00000");
break;
case 6:
label1.Text = _DataFloat.ToString("0.000000");
break;
default:
label1.Text = _DataFloat.ToString("0.00");
break;
}
How about:
var format = String.Format("0.{0}", new string('0', _Digits));
label1.Text = _DataFloat.ToString(format);
I have the following stored procedure that I have to get data from:
EXECUTE [dbo].[StationHealthStatusSummary2]
#LineId varchar(100), // 5,9,10
#MeasurementDt datetime, //2012/06/06
#Ntotal Int output,
#N0 int output,
#N1 int output,
#N2 int output,
#N3 int output,
#N4 int output,
#N5 int output,
#N6 int output,
#N7 int output,
#N8 int output,
#N9 int output,
#N10 int output,
#N11 int output,
#N12 int output,
#N13 int output,
#N14 int output,
#N15 int output,
#N16 int output
GO
Now I can send parameters to LineID and Measurement date as follows:
SqlConnection sql = new SqlConnection(#"Data Source=(local)\SQLEXPRESS;Initial Catalog=iComs;Persist Security Info=True;User ID=sa;Password=Password);
SqlCommand getData = new SqlCommand("StationHealthStatusSummary2", sql);
SqlDataAdapter da = new SqlDataAdapter(getData);
getData.CommandType = CommandType.StoredProcedure;
getData.Parameters.Add(new SqlParameter("#LineId", Lines));
getData.Parameters.Add(new SqlParameter("#MeasurementDt", date1));
SqlParameter ParamaterNtotal = new SqlParameter();
ParamaterNtotal.ParameterName = "#Ntotal";
ParamaterNtotal.SqlDbType = SqlDbType.Int;
ParamaterNtotal.Direction = ParameterDirection.Output;
getData.Parameters.Add(ParamaterNtotal);
sql.Open();
getData.ExecuteNonQuery();
Now I can get the value of NTotal and assign it to a Teechart (PieSlice),
but how do I get the value for #N0..#N16?
I've got some code that might give you some idea of what I'm trying to accomplish.
int NTotal = int.Parse(getData.Parameters["#Ntotal"].Value.ToString());
if (GetVariantVariableI(getData.Parameters[0].Value) = 0)
{
for (c = 1; c <= 18; c++)
{
Nvl = GetVariantVariableI(getData.Parameters[2+c].Value);
switch(c)
{
case 1:
NTotal = Nvl;
break;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
cstatus = c-2;
NPieValues[cstatus] = Nvl;
break;
}
string SliceName;
int NUsed;
NUsed = 0;
for(i=0;i<=16;i++)
{
NUsed = NUsed + NPieValues[i];
}
if (NUsed < NTotal)
{
Chart1.Series[0].Add(NTotal - NUsed);
slice1.Title = "Not Connected";
slice1.Add();
slice1.Color = System.Drawing.Color.Silver;
}
if (NUsed > NTotal)
{
NPieValues[7] = NPieValues[7]-(NUsed-NTotal);
}
for (i=0;i<=16;i++)
{
if (NPieValues[i]>0)
{
switch(i)
{
case 0: SliceName ="Green";
break;
case 1: SliceName ="Yellow";
break;
case 2: SliceName ="Orange";
break;
case 3: SliceName ="Red";
break;
case 4: SliceName ="Broken Rail";
break;
case 5: SliceName ="Buckling Rail";
break;
case 6: SliceName ="Maintenance required";
break;
case 7: SliceName ="Station(s) Off";
break;
case 8: SliceName ="Rail Differential kN";
break;
case 9: SliceName ="Left Rail Sensor Faulty";
break;
case 10: SliceName ="Right Rail Sensor Faulty";
break;
case 11: SliceName ="Temperature Rail Sensor Faulty";
break;
case 12: SliceName ="Calibration Required";
break;
case 13: SliceName ="Station Vandalised";
break;
case 14: SliceName ="Station uninstalled";
break;
case 15: SliceName ="Gauges removed for Maintenance";
break;
case 16: SliceName ="No GSM Coverage";
break;
default:
SliceName ="?";
}
switch(i)
{
case 0: clr = "System.Drawing.Color.Green";
break;
case 1:clr = "System.Drawing.Color.Yellow";
break;
case 2:clr = "System.Drawing.Color.Orrange";
break;
case 3:clr = "System.Drawing.Color.Red";
break;
case 4:
case 5:
case 8:clr = "System.Drawing.Color.Purple";
break;
case 6:clr = "System.Drawing.Color.Black";
break;
case 7:clr = "System.Drawing.Color.Gray";
break;;
case 9:clr = "System.Drawing.ColorTranslator.FromHtml('#E0671F')";
break;
case 10:clr = "System.Drawing.ColorTranslator.FromHtml('#BA4EC2')";
break;
case 11:clr = "System.Drawing.ColorTranslator.FromHtml('#FF8000')";
break;
case 12:clr = "System.Drawing.ColorTranslator.FromHtml('#BF4093')";
break;
case 13:clr = "System.Drawing.Color.SkyBlue";
break;
case 14:clr = "System.Drawing.Color.Aqua";
break;
case 15:clr = "System.Drawing.ColorTranslator.FromHtml('#BFBFFF')";
break;
case 16:clr = "System.Drawing.Color.MedGray";
break;
default : clr = "System.Drawing.Color.White";
break;
}
slice1.Add(NPieValues[i],SliceName,clr);
}
}
}
}
}
Now after it got all those values it has to populate the piechart.
Please, any help will be highly appreciated and please tell me if I'm being too vague.
Thanks
You have added #Ntotal as an Output parameter, why didn't you add all the others?
SqlParameter n = new SqlParameter();
n.ParameterName = "#N0";
n.SqlDbType = SqlDbType.Int;
n.Direction = ParameterDirection.Output;
getData.Parameters.Add(n);
Then you can retrieve the output values the same way you do with #Ntotal. Also, you can retrieve the values by name instead of looping through them, if you prefer.
Thanks. I Figured it out...
after i send the parameters as follows:
SqlParameter Paramater0 = new SqlParameter();
Paramater0.ParameterName = "#N0";
Paramater0.SqlDbType = SqlDbType.Int;
Paramater0.Direction = ParameterDirection.Output;
getData.Parameters.Add(Paramater0);
I then get the value and declare it to a var as follows:
int N0 = int.Parse(getData.Parameters["#N0"].Value.ToString());
and finally declare that int to a slice on the chart as follows:
slice1.Add(N0, "Green", System.Drawing.Color.Green);
Thanks for your help #mgnoonan :)