簡體   English   中英

DataGridView 排序導致 NullReferenceException

[英]DataGridView sorting leads to NullReferenceException

我想要一個 DataGridView,用戶可以通過單擊表標題對其進行排序。 DataGridViews 數據綁定到一個 DataView 並且數據的最后一行應該是 sum 行(此代碼中沒有實現 sum!),它需要始終是最后一行(換句話說,它需要是免排序)。

基於這個答案,我在課堂上實現了以下代碼:

using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace PipelineManagement.Debug
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            tlp1.RowStyles.Clear();
            for (var i = 0; i < 1; i++)
            {
                tlp1.RowStyles.Add(new RowStyle(SizeType.Absolute, 200));
                var gbNew = new GroupBox();
                gbNew.Text = "gb" + i;
                gbNew.Size = new Size(tlp1.Size.Width - 2, 185);
                gbNew.Anchor = AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom | AnchorStyles.Left;
                m_dgv = new DataGridView();
                m_dgv.Parent = gbNew;
                m_dgv.AutoSize = true;
                m_dgv.Location = new Point(5, 25);
                m_dgv.Size = new Size(gbNew.Size.Width - 10, gbNew.Size.Height - 70);
                m_dgv.Anchor = AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left;
                m_dt = new DataTable();
                for (var j = 0; j < 2; j++)
                {
                    var NewColumn = new DataColumn("Column" + j, typeof(Double));
                    m_dt.Columns.Add(NewColumn);
                }
                var k = 5;
                for (var j = 0; j < 5; j++)
                {
                    var NewRow = m_dt.NewRow();
                    NewRow[0] = Convert.ToDouble(k--);
                    m_dt.Rows.Add(NewRow);
                }
                m_dt.AcceptChanges();
                m_dgv.ColumnHeaderMouseClick += dgv_ColumnHeaderMouseClick;
                m_dgv.CellValueChanged += CellValueChangedHandler;
                m_dgv.DataSource = m_dt.DefaultView;

                tlp1.Controls.Add(gbNew);
            }
        }

        private void dgv_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            var col = m_dgv.Columns[e.ColumnIndex].Name;
            if (col != "")
            {
                if (m_Direction == ListSortDirection.Ascending)
                {
                    m_Direction = ListSortDirection.Descending;
                }
                else
                {
                    m_Direction = ListSortDirection.Ascending;
                }                
                sort_dgv(col, m_Direction);
            }
        }

        private void CellValueChangedHandler(Object sender, DataGridViewCellEventArgs e)
        {
            var temp = m_dt.Rows[0].Field<Double>(0);
            m_dt.Rows[m_dt.Rows.Count-1].SetField<Double>(0, m_dt.Rows[m_dt.Rows.Count - 1].Field<Double>(0) + 1);
        }

        private void sort_dgv(String ColumnName, ListSortDirection Direction)
        {
            if (!m_dt.Columns.Contains("sortMe"))
            {
                m_dt.Columns.Add("sortMe", typeof(Int32));
            }
            var dr = m_dt.Rows[m_dt.Rows.Count - 1];

            m_dt.DefaultView.Sort = "";
            for (int r = 0; r < m_dt.Rows.Count; r++)
            {
                m_dt.Rows[r]["sortMe"] = 0;
            }
            dr["sortMe"] = int.MaxValue;

            if (Direction == ListSortDirection.Descending)
            {
                m_dt.DefaultView.Sort = "sortMe," + ColumnName + " DESC";
            }
            else
            {
                m_dt.DefaultView.Sort = "sortMe," + ColumnName;
            }
            m_dt.Columns.Remove("sortMe");
        }

        private DataGridView m_dgv;
        private DataTable m_dt;
        private ListSortDirection m_Direction = ListSortDirection.Ascending;
    }
}

問題:一旦我點擊任何標題對表格進行排序 - 這按預期工作 - 當我更改任何單元格中的值(並且 CellValueChangedHandler 被調用)時,我得到一個 System.NullReferenceException: 'Object reference not set to an instance of一個東西。' 在行中

m_dt.Rows[m_dt.Rows.Count-1].SetField<Double>(0, m_dt.Rows[m_dt.Rows.Count - 1].Field<Double>(0) + 1);

上面的一行我能夠從完全相同的行(存儲在變量 temp 中)獲取值,但是一旦我嘗試寫入單元格,就會拋出異常。

問題:有人知道為什么我可以從單元格中讀取值但在寫入時出現異常嗎?

嘗試以下代碼:

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;

namespace WindowsFormsApplication44
{
    public partial class Form1 : Form
    {
        DataTable m_dt = new DataTable();

        public Form1()
        {
            InitializeComponent();

            m_dgv.CellValueChanged += CellValueChangedHandler;

            m_dt.Columns.Add("Col_A", typeof(double));
            m_dt.Columns.Add("Col_B", typeof(string));
            m_dt.Rows.Add(new object[] { 1 });

            m_dgv.DataSource = m_dt;
        }

        private void CellValueChangedHandler(Object sender, DataGridViewCellEventArgs e)
        {
            DataGridView dgv = sender as DataGridView;
            DataGridViewCellEventArgs arg = e as DataGridViewCellEventArgs;
            int row = arg.RowIndex;
            int col = arg.ColumnIndex;

            if (row >= 0 && row == dgv.Rows.Count - 2) //new row already added to DGV
            {
                if (row == 0)
                {
                    if (col != 0)
                    {
                        dgv.Rows[row].Cells[0].Value = 1;
                    }
                }
                else
                {
                    double temp = (double)dgv.Rows[row - 1].Cells[0].Value;
                    dgv.Rows[row].Cells[0].Value = temp + 1;
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            m_dt = m_dt.AsEnumerable().OrderBy(x => x.Field<string>("Col_B")).CopyToDataTable();
            m_dgv.DataSource = null;
            m_dgv.DataSource = m_dt;
        }

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM