WedX - журнал о программировании и компьютерных науках

Отобразите мои заполненные значения массива в списке и, при необходимости, удалите их.

Итак, с помощью замечательных парней из Stackoverflow я создал свой массив следующим образом.

public partial class Form1 : Form    
{
    string[] Brands = new string[10];
    int brandNo;}

    public Form1()
    {
       InitializeComponent();
       Brands[0] = "Yamaha"; //ok
       Brands[1] = "Suzuki"; //ok
       Brands[2] = "Harley"; //ok
       Brands[3] = "Kawasaki"; //ok
       brandNo = 4;
    }

    private void buttonAddbrand_Click(object sender, EventArgs e)
    {
       if (brandNo >= 10)
          return; //cannot add more brand

       Brands[brandNo++] = textBoxMerk.Text;
       var Merk = Brands
       listBoxMotoren.Items.Clear();

       listBoxMotoren.Items.AddRange(Merk);

С помощью этого кода я хочу отобразить заполненные значения массива в моем списке. Но я получаю следующую ошибку:

значение не может быть нулевым.

Помощь будет высоко оценена.


  • Зачем вам нужен отдельный массив для хранения брендов? Обработчик кнопки может быть таким же простым, как listBoxMotoren.Items.Add(textBoxMerk.Text);. И на вопрос: у вас есть синтаксическая ошибка в данном коде (отсутствуют ; и }), убедитесь, что вы показали нам настоящий код, который содержит ошибку, предоставьте полное сообщение об ошибке и укажите все детали, например, в какой строке это происходит, было ли это время компиляции или выполнения и т. д. 12.01.2016
  • Да, извиняюсь, не так скопировал. Синтаксические ошибки исчезли. Я получаю это сообщение об ошибке: в System.Windows.Forms.dll произошло необработанное исключение типа «System.ArgumentNullException». 12.01.2016
  • Измените свой вопрос, чтобы предоставить соответствующие сведения. И вы забыли указать, на какой строке возникает ошибка (добавить комментарий // error here). 12.01.2016

Ответы:


1

Во-первых, будьте осторожны с тем, где вы ставите фигурную скобку, чтобы убедиться, что код может быть скомпилирован.

public partial class Form1 : Form    
{
    string[] Brands = new string[10];
    int brandNo;} //<- off-placed

Во-вторых, поскольку вы начинаете с создания массива в качестве своего DataSource (и не используете Items.Add или Items.AddRange для своего listBoxMotoren, может быть последовательным, если вы делаете это при добавлении или удалении вашего элемента в listBoxMotoren.

private void buttonAddbrand_Click(object sender, EventArgs e) {
    if (brandNo >= 10)
        return; //cannot add more brand

    Brands[brandNo++] = textBoxMerk.Text;
    listBoxMotoren.DataSource = null; //the cheapest and dirtiest trick to do this
    listBoxMotoren.DataSource = Brands; //Maintaining the style, use `DataSource` to accommodate new data
}

Наконец, если вы хотите удалить элемент бренда по своему желанию, вам может понадобиться еще один Control в вашем Form1 в качестве входных данных для того, какой элемент бренда вы хотите удалить при необходимости. Но имейте в виду, что это может «разрушить» последовательность ваших элементов, и поэтому вам может потребоваться «повторно упорядочить» ваш элемент.

Теперь предположим, что вы используете NumericUpDown для удаления и инициируете удаление с помощью buttonDeletebrand, тогда вы должны сделать что-то вроде этого

private void buttonDeletebrand_Click(object sender, EventArgs e) {
    int indexToDelete = (int)numericUpDownMotorenNumberDeleted.Value; //note the casting to (int)
    if (indexToDelete < 0 || indexToDelete >= brandNo || brandNo <= 0) //can only delete index no [0] to [brandNo-1], and if the brand no > 0
        return; //invalid index
    for (int i = indexToDelete; i < brandNo - 1; ++i)
        Brands[indexToDelete] = Brands[indexToDelete + 1]; //resequencing
    Brands[brandNo - 1] = string.Empty; //removes the last element after resequencing
    listBoxMotoren.DataSource = null; //remember the cheapest and dirtiest trick?
    listBoxMotoren.DataSource = Brands;
    --brandNo; //reduce the brandNo by 1
}

В общем, вам нужно все вместе:

public partial class Form1 : Form {
    string[] Brands = new string[10];
    int brandNo;
    public Form1() {
        InitializeComponent();
        Brands[0] = "Yamaha";
        Brands[1] = "Suzuki";
        Brands[2] = "Harley";
        Brands[3] = "Kawasaki";
        brandNo = 4;
        listBoxMotoren.DataSource = Brands;
    }

    private void buttonAddbrand_Click(object sender, EventArgs e) {
        if (brandNo >= 10)
            return;

        Brands[brandNo++] = textBoxMerk.Text;
        listBoxMotoren.DataSource = null;
        listBoxMotoren.DataSource = Brands;
    }

    private void buttonDeletebrand_Click(object sender, EventArgs e) {
        int indexToDelete = (int)numericUpDownMotorenNumberDeleted.Value;
        if (indexToDelete < 0 || indexToDelete >= brandNo || brandNo <= 0)
            return;
        for (int i = indexToDelete; i < brandNo - 1; ++i)
            Brands[indexToDelete] = Brands[indexToDelete + 1];
        Brands[brandNo - 1] = string.Empty;
        listBoxMotoren.DataSource = null;
        listBoxMotoren.DataSource = Brands;
        --brandNo;
    }
}
12.01.2016
  • Еще раз, спасибо. Но, к сожалению, это не работает. Когда я нажимаю кнопку «Добавить бренд», он не падает или что-то в этом роде, но просто ничего не отображает в списке. Странно то, что у меня точно такой же код, как у вас. 13.01.2016
  • @Needsomehelp, ты серьезно? но Addbrand идентичен тому, что у вас было раньше, не так ли? Проверьте еще раз, пожалуйста. И используя отладчик, если это возможно 13.01.2016
  • private void buttonAddbrand_Click(object sender, EventArgs e) { if (brandNo >= 10) return; //cannot add more brand Brands[brandNo++] = textBoxMerk.Text; listBoxMotoren.DataSource = null; //the cheapest and dirtiest trick to do this listBoxMotoren.DataSource = Brands; //Maintaining the style, use DataSource` для размещения новых данных }` если ваш номер бренда не превышает 10, это должно что-то добавить 13.01.2016
  • Я потерян. Я скопировал ваш код. Программа работает нормально. Никаких проблем с компиляцией. Но когда я нажимаю кнопку добавления: в списке ничего не появляется =( 13.01.2016
  • Может быть, это потому, что вы copied мой код... Он должен быть remade (тоже для вашего лучшего понимания!), а не copied... Вы обрабатываете свое событие buttonAddbrand_Click в своем дизайнере? 13.01.2016
  • Да, сначала я просто переделал ваш код. Но когда это не сработало, я дважды проверил. Когда это тоже не удалось, я просто скопировал ваш код. Даже тогда список ничего не показывает. Что вы имеете в виду под обработкой события btn в вашем дизайнере? 13.01.2016
  • Вы дважды щелкнули buttonAddbrand в дизайнере? Если вы этого не сделаете, вы не сможете войти в четный обработчик buttonAddbrand_Click. Я имею в виду, что каждый из ваших control (например, buttonAddbrand) в дизайнере, чтобы он мог войти в обработчик событий (например, buttonAddbrand_Click), должен иметь этот обработчик событий, добавленный в элемент управления. Обычно Visual Studio делает это автоматически, когда вы дважды щелкаете элемент управления в представлении дизайнера. Но если вы копируете и вставляете код, этот шаг пропускается. 13.01.2016
  • О, вот так, да, я сделал. Но если бы я этого не сделал, я бы получил ошибку, если я прав. 13.01.2016
  • Вы должны убедиться, что имя обработчика события в вашем файле class.cs идентично имени в файле class.designer.cs, тогда событие сработает. Без чего причина, по которой вы ничего не добавили, не в том, что с программой что-то не так, а в том, что событие button click вообще не обрабатывается. Проверьте это! 13.01.2016
  • Я сейчас сравниваю form1.cs и form1.designer.cs. Имя точно такое же! 13.01.2016
  • У вас есть эта строка this.buttonAddbrand.Click += new System.EventHandler(this.buttonAddbrand_Click); в вашем designer.cs? 13.01.2016
  • Да. Я на 100% уверен. Глядя на это прямо сейчас. 13.01.2016
  • Хорошо, а если вы поместите точку останова в обработчик события buttonAddbrand_Click, а затем запустите программу и нажмете buttonAddbrand, действительно ли ваша программа попадет в обработчик события buttonAddbrand_Click? 13.01.2016
  • В этом случае проверьте следующее: stackoverflow. com/questions/34770189/ вам может понадобиться использовать BindingList 13.01.2016

  • 2

    я почти уверен, что этот код даже не компилируется....

       int brandNo;} <- "}" ???
    
       var Merk = Brands <- ";" missing and (var Merk) not needed
    

    блокировка этого кода, я думаю, проблема в
    проверке

    if (listBoxMotoren != null && listBoxMotoren.Items.Any()) 
           listBoxMotoren.Items.Clear();
    

    и конечно

    if (listBoxMotoren != null && Brands  != null)
       listBoxMotoren.Items.AddRange(Brands);
    

    если listboxMotoren имеет значение null, форма еще не инициализирована, так как long listBoxMotoren является элементом управления формы.

    12.01.2016
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]