0

Hello I was wondering how can I delete a row from the array in C# forms using a button, like you write which line# you want to delete and then pressing the button will delete that item from the list. The idea is to delete a row using "button 2" that reads the number written in a "textbox". And also how to show a warning message if the row doesn't exist. I cant use the "list<>" or "grid thing". Thanks if any of you have a little hand to lend me. ` public partial class Form1 : Form {

    int pos = 0;
    int counter = 0;
    string[,] sales = new String[50, 5];

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

        string product;
        double price, subtotal, total;
        int qty;

        textBox1.BackColor = Color.White;
        if (textBox1.Text == "")
        {
            textBox1.BackColor = Color.Red;
            textBox1.Focus();
            MessageBox.Show("MISSING PRODUCT!!!");
            return;
        }
            textBox2.BackColor = Color.White;
            if (textBox2.Text == "")
        {
            textBox2.BackColor = Color.Red;
            textBox2.Focus();
            MessageBox.Show("MISSING PRODUCT!!!");
             return;
        }
            textBox3.BackColor = Color.White;
            if (textBox3.Text == "")
        {
            textBox3.BackColor = Color.Red;
            textBox3.Focus();
            MessageBox.Show("MISSING PRODUCT!!!");
             return;
        }


        product = textBox1.Text;
        price = double.Parse(textBox2.Text);
        qty = int.Parse(textBox3.Text);
        subtotal = price * qty;

        sales[pos, 0] = pos.ToString();
        sales[pos, 1] = product;
        sales[pos, 2] = price.ToString();
        sales[pos, 3] = qty.ToString();
        sales[pos, 4] = subtotal.ToString();

        pos++;

      
        textBox5.Text = "";
        total = 0;
        for (int i = 0; i < sales.GetLength(0); i++)
        {

            textBox5.Text += sales[i, 0] + "      " + sales[i, 1] + "      " + sales[i, 2] + "      " + sales[i, 3] + "      " + sales[i, 4] + "      " + "\r\n";
            //<>
            if (sales[i, 4] != null)
            {
                total += int.Parse(sales[i, 4]);
            }

        }
             textBox4.Text = total.ToString();
            
            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
            textBox1.Focus();

    }

    private void button2_Click(object sender, EventArgs e)
    {
          
       // what to put here

    }
}

`

5
  • 5
    For the record, this isn't how you ..well code, in general. You seem to want a dynamic length array (List<> in C#) of a structured type (a class). Then you can remove items as you wish. Commented Jun 13, 2022 at 19:03
  • 3
    Are you just asking how to remove an element from an array? Though, to echo the above comment, all of your logic would be much simpler if you just use a List<> of a custom class. Commented Jun 13, 2022 at 19:06
  • 2
    consider using DataGridView for display of tabular data. you won't have to maintain 2D array - just add/edit/delete DataGridView.Rows. and there won't be a chance of missing row Commented Jun 13, 2022 at 19:09
  • Like the others have already said: you should generally prefer a higher-level class (like List<>) over arrays whenever possible. Furthermore, since your app seems to be a WinForms app, you should probably consider using a DataGridView. You can find many tutorials for using DataGridViews, e.g. c-sharpcorner.com/uploadfile/raj1979/… Commented Jun 13, 2022 at 19:22
  • Thank you guys but I am not allowed to use a (List<>), this is for my programming class at school, and the teacher said I could do that with 3 lines of code but the thing is that he never taught us how to delete things within the array. Im new to code so im sorry if i cant come up with the solution. Commented Jun 13, 2022 at 20:01

1 Answer 1

1

Context

I'm going to give you two answers here as you aren't clear on whether or not you are required to use an array instead of a List<>. I'm also a little unsure about what exactly you're asking for, as you haven't given any examples of what you hope the output would be, or anything like that, so I apologize if I totally miss the mark. Just let me know and I'll change my answer to match what you're asking more appropriately :)

Using an array

private void button2_Click(object sender, EventArgs e)
{
    //Checks to see if the desired row to delete exists
    if(sales[pos][0] is null)
    {
        //Lets the user know the index is already empty
        MessageBox.Show("Index has no product listed.");
        return;
    }
    
    //Loops through each item at the pos index
    for(int i = 0; i < sales.GetLength(1); i++)
    {
        //remove
        sales[pos][i] = null;
    }

    /*******************************************************
    * I'm unsure if you would want to drop the index of all
    * of the arrays with a larger index number down one, so
    * this next bit of code will do this, but if you don't
    * want this functionality, just ignore this.
    ********************************************************/

    //Loops through every index from pos to the second to last index
    for(int i = pos; i < sales.GetLength(0) - 1; i++)
    {
        //Loops through every index of a product
        for(int j = 0; j < sales.GetLength(1); j++)
        {
            //Sets current row to the value in the next
            sales[i][j] = sales[i+1][j];
        }
    }
}

Using a List<>

/*****************************************************
* I've changed the name of the variable to pascal case
* as this is Microsoft's documentation standard.
* This also shows how you would need to change the 
* declaration of the Sales object.
*****************************************************/
List<List<string>> Sales = new List<List<string>>();

private void button2_Click(object sender, EventArgs e)
{
    //Checks if the index is out of bounds of the list.
    if(pos > Sales.Count() - 1)
    {
        //Lets the user know the index out of bounds
        MessageBox.Show("Index is out of bounds.");
        return;
    }
    
    //Remove the product at the selected index
    Sales.RemoveAt(pos);
}

Products

I notice that you seem to be trying to make a list of products to be sold. I would recommend that you create a Product class, which holds all of the information that a product has. A quick mock up of that could look something like this:

public class Product 
{
    /**********************************************************
    * If you are unfamiliar with how properties work, 
    * I recommend looking into them more, but quick, simplified
    * explanation is they are just variables you access from
    * other classes that have access to this one by
    * saying, in this case, Product.AttributeOne, and you
    * can even set it by writing Product.AttributeOne = "foo";
    **********************************************************/
    
    public string AttributeOne { get; set; }
    public string AttributeTwo { get; set; }
    public string AttributeThree { get; set; }
    public string AttributeFour { get; set; }
    public string AttributeFive { get; set; }
    
}

Using this class could simplify other code you have, and make your array/list one dimensional. I would highly recommend making products an object, just as it would give you more functionality for a lot less code. I'll show you how the code for button1_Click and button2_Click() would look like with this change

public partial class Form1 : Form
{

    int pos = 0;
    int counter = 0;
    List<Product> Sales = new List<Product>();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

        string product;
        double price, subtotal, total;
        int qty;

        textBox1.BackColor = Color.White;

        if (textBox1.Text == "")
        {
            textBox1.BackColor = Color.Red;
            textBox1.Focus();
            MessageBox.Show("MISSING PRODUCT!!!");
            return;
        }

        textBox2.BackColor = Color.White;

        if (textBox2.Text == "")
        {
            textBox2.BackColor = Color.Red;
            textBox2.Focus();
            MessageBox.Show("MISSING PRODUCT!!!");
            return;
        }

        textBox3.BackColor = Color.White;

        if (textBox3.Text == "")
        {
            textBox3.BackColor = Color.Red;
            textBox3.Focus();
            MessageBox.Show("MISSING PRODUCT!!!");
            return;
        }


        product = textBox1.Text;
        price = double.Parse(textBox2.Text);
        qty = int.Parse(textBox3.Text);
        subtotal = price * qty;

        Sales.ElementAt(pos).AttributeOne = pos.ToString();
        Sales.ElementAt(pos).AttributeTwo = product;
        Sales.ElementAt(pos).AttributeThree = price.ToString();
        Sales.ElementAt(pos).AttributeFour = qty.ToString();
        Sales.ElementAt(pos).AttributeFive = subtotal.ToString();

        pos++;

  
        textBox5.Text = "";
        total = 0;

        for (int i = 0; i < Sales.Count; i++)
        {

            textBox5.Text += Sales.ElementAt(i).AttributeOne + "      " + Sales.ElementAt(i).AttributeTwo + "      " + Sales.ElementAt(i).AttributeThree + "      " + Sales.ElementAt(i).AttributeFour + "      " + Sales.ElementAt(i).AttributeFive + "      " + "\r\n";
            //<>
            if (Sales.ElementAt(i).AttributeFive != null)
            {
                total += int.Parse(sales[i, 4]);
            }

        }

        textBox4.Text = total.ToString();
            
        textBox1.Text = "";
        textBox2.Text = "";
        textBox3.Text = "";
        textBox1.Focus();

    }

    private void button2_Click(object sender, EventArgs e)
    {
        //Checks if the index is out of bounds of the list.
        if(pos > Sales.Count() - 1)
        {
            //Lets the user know the index out of bounds
            MessageBox.Show("Index is out of bounds.");
            return;
        }
        
        //Remove the product at the selected index
        Sales.RemoveAt(pos);
    }
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.