如何在 DataGridView 中按列排序之前验证列名

How to validate columnname before sorting by column in DataGridView

当我尝试通过单击 header 列对 DataGridView 中的特定列进行排序时,出现异常。我知道发生这种情况是因为列名包含空格。

我现在的问题是:单击 header 时如何在名称两边加上方括号?

我还没有找到 属性 的 header 单击事件或类似的东西来动态避免此类问题。有没有不改文件或数据表名称的解决方案?

从数据库 table 中检索数据时,如果列的字段名称中有空格,最好使用字段别名,例如SELECT [First Name ]As FirstName 然后将 DataGridView 数据源设置为 DataTable,然后将 DataColumn header 文本设置为字段名称,例如DataGridView1.Columns[“名字”] = “名字”。这是 amy 排序是针对 First Name 的 FirstName 别名完成的。

这是代码,请参见下面的代码屏幕截图,sheet数据和代码侧重于概念。

using System;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Windows.Forms;

namespace Example_C1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public string ConnectionString(string FileName, string Header)
        {
            OleDbConnectionStringBuilder Builder = new OleDbConnectionStringBuilder();
            if (System.IO.Path.GetExtension(FileName).ToUpper() == ".XLS")
            {
                Builder.Provider = "Microsoft.Jet.OLEDB.4.0";
                Builder.Add("Extended Properties", string.Format("Excel 8.0;IMEX=1;HDR={0};", Header));
            }
            else
            {
                Builder.Provider = "Microsoft.ACE.OLEDB.12.0";
                Builder.Add("Extended Properties", string.Format("Excel 12.0;IMEX=1;HDR={0};", Header));
            }

            Builder.DataSource = FileName;

            return Builder.ConnectionString;
        }

        public DataTable LoadData(string FileName, string SheetName, DateTime TheDate)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            DataTable dt = new DataTable();

            using (OleDbConnection cn = new OleDbConnection { ConnectionString = ConnectionString(FileName, "Yes") })
            {
                cn.Open();
                using (OleDbCommand cmd = new OleDbCommand { CommandText = 
                    @"
                        SELECT 
                            [Dates], 
                            [Office Plan] As OfficePlan 
                        FROM [Sheet2$] 
                        WHERE [Dates] = #8/21/2013#", Connection = cn })
                {
                    OleDbDataReader dr = cmd.ExecuteReader();
                    dt.Load(dr);
                }

                return dt;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DateTime TheDate = new DateTime(2010, 8, 21);
            DataGridView1.DataSource = LoadData(
                Path.Combine(Application.StartupPath, "WS1.xlsx"), "Sheet2", TheDate).DefaultView;
            DataGridView1.Columns["OfficePlan"].HeaderText = "Office Plan";
        }
    }
}

请注意,我使用了我所做的现有示例,这就是为什么存在 where 条件的原因。