Неожиданное исключение происходит, когда я вызываю DataRowCollection.Add - PullRequest
0 голосов
/ 20 ноября 2018

В следующем коде:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SQLite;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
    public partial class List : Form
    {
        public List()
        {
            InitializeComponent();
        }

        private void List_Load(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = 1;
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            var cmd = new SQLiteCommand("select * from students", DB.Connection);
            var ad = new SQLiteDataAdapter(cmd);
            var dt = new DataTable();
            ad.Fill(dt);
            listBox1.DataSource = dt;
            listBox1.DisplayMember = "name";
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            Debug.Assert(listBox1.DataSource is DataTable);
            var dt = listBox1.DataSource as DataTable;
            dt.Rows.Add();
            btnEdit.Enabled = btnRemove.Enabled = dt.Rows.Count != 0;
        }

        private void btnEdit_Click(object sender, EventArgs e)
        {
            Debug.Assert(listBox1.SelectedItem is DataRowView);
            new StudentsForm2(listBox1.SelectedItem as DataRowView).ShowDialog(this);
        }

        private void btnRemove_Click(object sender, EventArgs e)
        {
            Debug.Assert(listBox1.DataSource is DataTable);
            var dt = listBox1.DataSource as DataTable;
            dt.Rows.RemoveAt(listBox1.SelectedIndex);
            btnEdit.Enabled = btnRemove.Enabled = dt.Rows.Count != 0;
        }

        private void List_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                Close();
            }
        }

    }
}

когда таблица пуста, я получаю следующее исключение:

Произошло первое исключение типа «System.ArgumentOutOfRangeException»в System.Windows.Forms.dll

Дополнительная информация: InvalidArgument = значение '0' недопустимо для 'SelectedIndex'.

в методе btnAdd_Click при вызове dt.Rows.Добавлять().comboBox1 содержит имена таблиц, но в настоящее время у меня есть только одна таблица, она не используется, если только не будет вызван comboBox1_SelectedIndexChanged.

Вот трассировка стека в том месте, где выдается исключение:

в System.Environment.GetStackTrace (Исключение e, логическое needFileInfo) в System.Environment.get_StackTrace () в System.Windows.Forms.ListBox.set_SelectedIndex (значение Int32) в System.Windows.Forms.ListControl.DataMander_Pc., EventArgs e) в System.Windows.Forms.CurrencyManager.OnPositionChanged (EventArgs e) в System.Windows.Forms.CurrencyManager.ChangeRecordState (Int32 newPosition, логическая проверка, логическое значение endCurrentEdit, логическое выражение firePositionChange для Windows).CurrencyManager.List_ListChanged (Отправитель объекта, ListChangedEventArgs e) в System.Data.DataView.OnListChanged (ListChangedEventArgs e) в System.Data.DataView.IndexListChanged (Отправитель объекта, ListChangedEvent.Data eata e)ew.IndexListChangedInternal (ListChangedEventArgs e) в System.Data.DataViewListener.IndexListChanged (ListChangedEventArgs e) в System.Data.Index. <> c.b__88_0 (прослушиватель DataViewListener, ListChangedEventleang2).Действие 1.Notify[T1,T2,T3](T1 arg1, T2 arg2, T3 arg3, Action 4) в System.Data.Index.OnListChanged (ListChangedEventArgs e) в System.Data.Index.OnListChanged (ListChangedType changeType, индекс Int32) в System.Data.Index.InsertRecord (запись Int32, логическое значение fireEvent).Data.Index.ApplyChangeAction (Int32 запись, действие Int32, Int32 changeRecord) при System.Data.Index.RecordStateChanged (Int32 запись, DataViewRowState oldState, DataViewRowState NewState) в System.Data.DataTable.RecordStateChanged (Int32 record1, DataViewRowState oldState1, DataViewRowStatenewState1, Int32 record2, DataViewRowState oldState2, DataViewRowState newState2) в System.Data.DataTable.SetNewRecordWorker (строка DataRow, Int32 предложилRecord, действие DataRowAction, логическое значение isInMerge, логическое подавлениеEnsurePropertyChanged, позиция Int32, логическое fireEvent, Exception & deferredException) в System.Data.DataTable.InsertRow (строка DataRow, Int64 предложил ID, Int32 pos, Boolean fireEvent) в System.Data.DataRowCollection.Add (значения Object []) в WindowsFormsApplication1.List.btnAdd_Click (Отправитель объекта, EventArgs e) в C: \ Users \ hamidi \ Documents \ Visual Studio 2010 \ Projects \ m_rezaee \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ List.cs: строка 44 в System.Windows.Forms.Control.OnClick (EventArgs e) в System.Windows.Forms.Button.OnClick (EventArgs e) в System.Windows.Forms.Button.OnMouseUp (MouseEventArgs mevent) в System.Windows.Forms.Control.WmMouseUp (сообщение & m, кнопка MouseButtons, щелчки Int32) вSystem.Windows.Forms.Control.WndProc (Сообщение & m) в System.Windows.Forms.ButtonBase.WndProc (Сообщение & m) в System.Windows.Forms.Button.WndProc (Сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & m) в System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW (MSG & msg) в System.Windows.Forms.Com..System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (IntPtr dwComponentID, причина Int32, Int32 pvLoopData) в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (причина Int32), причина32;в System.Windows.Forms.Application.ThreadContext.RunMessageLoop (причина Int32, контекст ApplicationContext) в System.Windows.Forms.Application.Run (Форма mainForm) в WindowsFormsApplication1.Program.Main () в C: \ Users \ hamidi \ Documents \ Visual Studio 2010 \ Projects \ m_rezaee \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Program.cs: строка 18 в System.AppDomain._nExecuteAssembly (сборка RuntimeAssembly, аргументы String []) в System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта) в System.Threading.ExecutionContext.RunInternal (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое preserveSyncCtx) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое preserveSyncCtx) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ThreadHelper.ThreadStart ()

Я не мог найти ни малейшего понятия о том, почему это происходит.

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