在buttonHandler
方法中,我需要能够appliances[tagValue].active = true;
,但是当我这样做时,我收到错误,说该变量是只读的。我需要更改什么才能使其不是只读的?如果有人可以给我看或给出一个例子,那将非常感激。
private void frmPowerViewer_Load(object sender, EventArgs e)
{
//List<string> Appliances = File.ReadAllLines(@"\\psf\Home\Desktop\School\Advanced C#\Unit2\Program1\Watts.csv").ToList()
//List<ApplianceDA> newAppliances = new List<ApplianceDA>();
var appliances = new List<ApplianceDA>();
using (var file = new System.IO.StreamReader(@"\\psf\Home\Desktop\School\Advanced C#\Unit2\Program1\Watts.csv"))
{
while (file.Peek() != -1)
{
var line = file.ReadLine();
var fields = line.Split(',');
var obj = new ApplianceDA(fields[0], Convert.ToInt32(fields[1]), false);
appliances.Add(obj);
}
file.Close();
}
displayButtons(appliances);
}
private void displayButtons(List<ApplianceDA> appliances)
{
Button[] appliancesButtons = new Button[14];
int yLocation = 200;
int yLocation2 = 250;
int xLocation2 = 0;
int yLocation3 = 300;
int xLocation3 = 0;
// now loop through the array of buttons and add a new button and where it goes on the form.
for (int x = 0; x <= 5; x++)
{
appliancesButtons[x] = new Button(); // This creates a new button and placed it in the array
appliancesButtons[x].Text = Convert.ToString(appliances[x].name); // This adds the text that goes on the button.
appliancesButtons[x].Location = new Point((x * 90), yLocation); // This sometimes is the hard part. Where does it go? First arg is left second arg is top of current button
appliancesButtons[x].Tag = x; // you can store all kinds of stuff in the tab property even objects. In this case it is just a number.
appliancesButtons[x].Click += (sender, e) => { buttonHandler(sender, e, appliances); }; // The button needs a click event handler. This wires up to the method buttonHandler.
Controls.Add(appliancesButtons[x]); // this adds the button to the controls colection of the form.
}
for (int x = 6; x <= 11; x++)
{
appliancesButtons[x] = new Button(); // This creates a new button and placed it in the array
appliancesButtons[x].Text = Convert.ToString(appliances[x].name); // This adds the text that goes on the button.
appliancesButtons[x].Location = new Point((xLocation2 * 90), yLocation2); // This sometimes is the hard part. Where does it go? First arg is left second arg is top of current button
appliancesButtons[x].Tag = x; // you can store all kinds of stuff in the tab property even objects. In this case it is just a number.
appliancesButtons[x].Click += (sender, e) => { buttonHandler(sender, e, appliances); }; // The button needs a click event handler. This wires up to the method buttonHandler.
Controls.Add(appliancesButtons[x]); // this adds the button to the controls colection of the form.
xLocation2++;
}
for (int x = 12; x <= 13; x++)
{
appliancesButtons[x] = new Button(); // This creates a new button and placed it in the array
appliancesButtons[x].Text = Convert.ToString(appliances[x].name); // This adds the text that goes on the button.
appliancesButtons[x].Location = new Point((xLocation3 * 90), yLocation3); // This sometimes is the hard part. Where does it go? First arg is left second arg is top of current button
appliancesButtons[x].Tag = x; // you can store all kinds of stuff in the tab property even objects. In this case it is just a number.
appliancesButtons[x].Click += (sender, e) => { buttonHandler(sender, e, appliances); }; // The button needs a click event handler. This wires up to the method buttonHandler.
Controls.Add(appliancesButtons[x]); // this adds the button to the controls colection of the form.
xLocation3++;
}
}
private void buttonHandler(object sender, EventArgs e, List<ApplianceDA> appliances)
{
Button clickedButton; // This is a local instance variable for the button that was clicked.
int tagValue; // This will hold what we stuffed in the tag of the button.
clickedButton = (Button)sender; // The sender needs to be cast into a button type
tagValue = (int)clickedButton.Tag; // Now cast the tag value into a integer
int price;
if (CheckText(txtPricePerKWH.Text) == true)
{
price = Convert.ToInt16(txtPricePerKWH.Text);
if (appliances[tagValue].active == true) {
clickedButton.BackColor = DefaultBackColor;
txtCurrentWattage.Text = Convert.ToString(Convert.ToInt16(txtCurrentWattage.Text) - Convert.ToInt16(appliances[tagValue].watt));
clickedButton.Text = appliances[tagValue].name;
}
else
{
clickedButton.BackColor = Color.LimeGreen;
clickedButton.Text = Convert.ToString(appliances[tagValue].watt + " Watt");
txtCurrentWattage.Text = Convert.ToString(Convert.ToInt16(txtCurrentWattage.Text) + Convert.ToInt16(appliances[tagValue].watt));
//Display Pricing
txtCostPerHour.Text = Convert.ToString((Convert.ToInt16(txtCurrentWattage.Text) *.001) * Convert.ToInt16(txtPricePerKWH.Text));
txtCostPerDay.Text = Convert.ToString(((Convert.ToInt16(txtCurrentWattage.Text) * .001) * Convert.ToInt16(txtPricePerKWH.Text))*24);
txtCostPerYear.Text = Convert.ToString(((Convert.ToInt16(txtCurrentWattage.Text) * .001) * Convert.ToInt16(txtPricePerKWH.Text)) * 8760);
//appliances[tagValue].active = true;
}
}
}
以下是ApplianceDA
类代码:
class ApplianceDA
{
private string mName;
private int mWatt;
private bool mActive;
public string name { get { return mName;} }
public int watt { get { return mWatt;} }
public bool active { get { return mActive; } }
public ApplianceDA(string theName, int theWatt, bool theActive)
{
this.mName = theName;
this.mWatt = theWatt;
this.mActive = theActive;
}
}
答案 0 :(得分:0)
查看active
课程中的ApplianceDA
属性。显然它是只读的。
您必须为活动属性添加setter。
public bool active
{
get { return mActive; }
set { mActive = value;}
}