나에게는 매우 혼란스러운 문제가 있습니다. 내 클래스의 생성자에서 두 배열 (문자열 및 이중)을 보유하는 SeatManager.cs의 인스턴스를 만듭니다. btnReserveCancel_Click 메서드에서 데이터로이 두 배열을 채우려고합니다. 하지만 나중에 UpdateGUI() 메서드를 호출하면 SeatManager.cs의 다른 인스턴스가 만들어집니다 (선생님은 다른 작업에 도움이 필요할 때 해당 선을 추가했습니다). 그러면 두 개의 배열에 채워진 모든 데이터가 잃어버린! wierd 부분은 내가 UpdateGUI()에서 새로운 인스턴스를 생성하는 줄을 지우면 컴파일러는 나에게 뭔가 잘못되었다고 외친다.개체의 인스턴스 호출
btnReserveCancel_Click이 아닌 경우 UpdateGUI()에서 SeatManager.cs의 새 인스턴스가 필요한 이유는 무엇입니까? UpdateGUI()가 인스턴스 변수에 사용 가능한 경우 SeatManager.cs의 새 인스턴스가 필요한 이유는 무엇입니까? 당신이 참조가 메모리에서 개체를 가리키는 한 다음 그것을, 이전에 지적 된 객체가 "손실"되는 새로운 인스턴스를 할당하는 경우
private double revenue = 0.0;
private const int totalNumOfSeats = 10;
private int numOfReservedSeats = 0; //Increases every time a new reservation is made
const double minLimit = 10;
const double maxLimit = 50;
private SeatManager seatMngr;
public MainForm()
{
InitializeComponent();
InitializeGUI();
seatMngr = new SeatManager(totalNumOfSeats);//skapar en instans av klassen SeatManager
UpdateGUI();
}
private void btnReserveCancel_Click(object sender, EventArgs e)
{
if (rbtnReserved.Checked == true)//Om radiobutton RESERVE är iklickad
{
string customerName = string.Empty;
double seatPrice = 0.0;
int selection = listBox1.SelectedIndex;
if (selection == -1)
{
MessageBox.Show(string.Format("You must select which seat you want to reserve!"), "Select a seat.", MessageBoxButtons.OK, MessageBoxIcon.None);
}
else
{
string getSeatNumber = listBox1.SelectedItem.ToString();//Tar första bokstaven i den markerade strängen i listboxen och gör om till index.
int seatNumber = int.Parse(getSeatNumber.Substring(0, 1));
bool inputOk = ReadAndValidateInput(out customerName, out seatPrice);
bool validSeats = CheckVacantSeats();
if (inputOk && validSeats)
{
if (seatMngr.ReserveSeat(customerName, seatPrice, seatNumber) != true)
{
var result = MessageBox.Show(string.Format("Do you wish to overwrite reservation? "), "Seat already registered", MessageBoxButtons.YesNo, MessageBoxIcon.None);
if (result == DialogResult.Yes)
{
double amount = seatMngr.GetPaidPrice(seatNumber);
MoneyBackWhenCancelOrOverwrite(amount);
seatMngr.ReserveSeatOverwrite(customerName, seatPrice, seatNumber);
revenue += seatPrice;
}
}
else
{
seatMngr.ReserveSeat(customerName, seatPrice, seatNumber);
numOfReservedSeats++;
revenue += seatPrice;
if (seatMngr.ReserveSeat(customerName, seatPrice, seatNumber) == true)
{
MessageBox.Show(string.Format("Det funkade "), "Sfgdfg", MessageBoxButtons.OK, MessageBoxIcon.None);
}
}
}
}
}
else if (rbtnCancel.Checked == true)//Om radiobutton CANCEL är iklickad.
{
string getSeatNumber = listBox1.SelectedItem.ToString();//Tar första bokstaven i den markerade strängen i listboxen och gör om till index.
int seatNumber = int.Parse(getSeatNumber.Substring(0, 1));
var result = MessageBox.Show(string.Format("Do you wish to cancel reservation? "), "Seat registered", MessageBoxButtons.YesNo, MessageBoxIcon.None);
if (result == DialogResult.Yes)
{
double amount = seatMngr.GetPaidPrice(seatNumber);
MoneyBackWhenCancelOrOverwrite(amount);
seatMngr.CancelSeat(seatNumber);
numOfReservedSeats--;
}
else { }
}
UpdateGUI();
}
private void UpdateGUI()
{
labelVacant.Text = (totalNumOfSeats - numOfReservedSeats).ToString();//Visar antal ledig platser.
labelReserved.Text = numOfReservedSeats.ToString();//Visar antal reserverade platser.
labelRevenue.Text = revenue.ToString();//Visar intäkter.
labelSeats.Text = totalNumOfSeats.ToString();//Visar totalt antal platser. Värdet är konstant så det kan inte ändras.
DisplayOptions choice = (DisplayOptions)comboBox1.SelectedIndex;
string[] strSeatInfoStrings;
//seatMngr = new SeatManager(totalNumOfSeats);
int display = seatMngr.GetSeatInfoStrings(choice, out strSeatInfoStrings);
listBox1.Items.Clear();
if (strSeatInfoStrings == null)
{
listBox1.Items.Add("No seats where found");
}
else
{
listBox1.Items.AddRange(strSeatInfoStrings);
}
}
해당 줄을 제거 할 때 발생하는 오류는 무엇입니까? – Tudor
nullreferenceexception이 처리되지 않았습니다. – user1051477