C # при попытке добавить следующую кнопку, получая отрицательное значение ошибки - PullRequest
0 голосов
/ 27 октября 2011

Создание клиент-серверного приложения Мне удалось заставить сервер соединиться с базой данных и отправить все записи клиенту, и он показывает первую запись во всех правильных текстовых полях, но когда я пытаюсь щелкнуть следующий кнопка показывает ошибку

"Индекс вышел за пределы диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс"

Вот код, который я использую для этого

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        client c1;
        int counter = 0;
        string results = "";
        List<House> loadedHouses = new List<House>();

        public Form1()
        {
            InitializeComponent();
            c1 = new client();
            c1.runClient();
            textBox1 = Convert.ToString(Counter);


        }

        private int _counter; //It defaults to 0, setting it to 0 is redundant.
        public int Counter
        {
            get { return _counter; }
            set
        {
            if (Equals(_counter, value)) return;

            if (value < 0) return;

            if ((loadedHouses != null) && (value > loadedHouses.Count)) return;

            _counter = value;

            GetHouse();
        }
        }



        private void GetFirst()
        {
            Counter = 0;
        }
        private void Getprevious()
        {
            Counter--;
        }
        private void Getnext()
        {
            Counter++;
            GetHouse();
        }
        private void Getlast()
        {
           Counter = ((loadedHouses == null) ? 0 : loadedHouses.Count);
        }



        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Funsold_Click(object sender, EventArgs e)
        {

        }

        private void Fsold_Click(object sender, EventArgs e)
        {

        }

        private void Fall_Click(object sender, EventArgs e)
        {
            string aQuery = "SELECT * FROM houses";


            string result = c1.getStringfromServer(aQuery);

            string[] Rows = result.Split('*');

            //try
            //{

                foreach (string r in Rows)
                {



                    string[] h = new string[5];
                    h = r.Split(',');
                    MessageBox.Show(h[0]);
                    // need to show the first record
                    House newhouse = new House();
                    if (h[0] == "")
                    {
                        MessageBox.Show("ARRRHHHJJJ CRASH!");
                    }
                    else
                    {
                        newhouse.ID = int.Parse(h[0]);


                    newhouse.Address = Convert.ToString(h[1]);
                    newhouse.Type = Convert.ToChar(h[2]);
                    newhouse.Cost = int.Parse(h[3]);
                    newhouse.Sold = Convert.ToString(h[4]);

                    loadedHouses.Add(newhouse);

                    ID_Number.Text = Convert.ToString(h[0]);

                    address1.Text = Convert.ToString(h[1]);
                    type1.Text = Convert.ToString(h[2]);
                    cost1.Text = Convert.ToString(h[3]);
                    sold1.Text = Convert.ToString(h[4]);



                    }
                    }

        //    }

        //        catch (Exception qq)
        //{
        //    MessageBox.Show (qq.Message);
        //}

            }
        public void GetHouse()
        {
            int m = Counter;
            House thisHouse = Counter < loadedHouses.Count ? loadedHouses[Counter] : null;

            ID_Number.Text = Convert.ToString(thisHouse.ID);
            address1.Text = Convert.ToString(thisHouse.Address);
            type1.Text = Convert.ToString(thisHouse.Type);
            cost1.Text = Convert.ToString(thisHouse.Cost);
            sold1.Text = Convert.ToString(thisHouse.Sold);
        }

        private void Next_Click(object sender, EventArgs e)
        {
            Getnext();
        }

        }
    }

Есть идеи?

Спасибо

Ответы [ 4 ]

1 голос
/ 27 октября 2011

Вы пытались использовать:

House thisHouse = counter < loadedHouses.Count ? loadedHouses[counter] : null

Я имею в виду: вы уверены, что ваш список содержит только одну запись?Поэтому, когда вы пытаетесь получить второе, вы получаете исключение ...

private void Getnext()
{

    if (counter < (loadedHouses.Count - 1))
    {
        counter++;
        GetHouse();
    }
}
0 голосов
/ 27 октября 2011

Кроме того, вы можете обновить свой метод getPrevious, чтобы гарантировать, что вы не попадете в отрицательные значения, и наоборот с getnext.

private void Getprevious()
        {
            counter--;
            if (counter < 0)
                  counter = 0;
        }
        private void Getnext()
        {
            counter++;
            if (counter > maxvaluesofrecords)
                  counter = max;
            else
                  GetHouse();
        }
0 голосов
/ 27 октября 2011

У вас нет элементов в загруженных домах. Он заполняется в вашем обработчике Fall_Click, который, скорее всего, не выполняется при нажатии кнопки Next.

Обновление : Прежде всего, убедитесь, что вы правильно выполняете свои индексы.

Например, строка

if ((loadedHouses != null) && (value > loadedHouses.Count) return;

должно быть

if ((loadedHouses != null) && (value >= loadedHouses.Count) return;

Также в вашей функции GetLast вы должны иметь:

loadedHouses.Count - 1
0 голосов
/ 27 октября 2011

Я не вижу нигде в вашем коде, что вы защищаете от выхода за пределы массива.

Вот предложение, чтобы исправить ваши проблемы ...

    private int _counter; //It defaults to 0, setting it to 0 is redundant.
    public int Counter
    {
        get { return _counter; }
        set
        {
            if (Equals(_counter, value)) return;

            if (value < 0) return;

            if ((loadedHouses != null) && (value > loadedHouses.Count) return;

            _counter = value;

            GetHouse();
        }
    }
    ...

    private void GetFirst()
    {
        Counter = 0;
    }
    private void Getprevious()
    {
        Counter--;
    }
    private void Getnext()
    {
        Counter++;
    }
    private void Getlast()
    {
        //Counter = results.Count(); //WTF? Why results.Count() when results is a string??
        Counter = ((loadedHouses == null) ? 0 : loadedHouses.Count);
    }

Однако вы также должны отключить / включить кнопки в зависимости от того, должен ли пользователь нажимать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...