如何在 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 条件的原因。
当我尝试通过单击 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 条件的原因。