我一直在寻找类似的问题,但经过几天的尝试后我找不到解决方案。问题如下:
我有一个程序,我必须创建每个字段,字段如下:ID,Name,2017Jan1,2017Jan2,...基本上,存储在MS-ACCESS中的数据库,将每个日期存储为字段
以下步骤是将其绑定到datagridview:
private void FillTable(string Month)
{
try
{
using (dbConn = new OleDbConnection(conStr))
{
OleDbCommand cmd;
cmd = dbConn.CreateCommand();
cmd.CommandText = "select * from " + Month + " ORDER BY ID";
DataSet dataSet = new DataSet();
dataTable = new DataTable();
dataSet.Tables.Add(dataTable);
dataAdapter = new OleDbDataAdapter(cmd);
dataAdapter.Fill(dataTable);
dataGrid.Show();
dataGrid.DataSource = dataTable.DefaultView;
dataGrid.Refresh();
dataGrid.Columns[0].ReadOnly = true;
dataGrid.Refresh();
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
月是表的名称,因为我必须为每个月创建表,即1月,2月...
我还创建了一个向表中添加行的方法,但是我遇到了以下问题。如果我想让新行可见,我必须重新加载整个数据库,否则datagridview将不会显示新行。 有没有办法轻松使新行可见? 在你问之前,我尝试使用dataGrid.Refresh()。
为了澄清,我将添加负责添加新行的代码片段。 由于我必须根据一个月内的字段数量处理超过30个字段,因此我为其创建了 for loops 。
private void btnAdd_Click(object sender, EventArgs e)
{
int value = dataGrid.CurrentCell.RowIndex + 1;
int countRow = dataGrid.RowCount - 1;
try
{
using (dbConn = new OleDbConnection(conStr))
{
string command = GetCreateRowCommand(value);
dbConn.Open();
dataAdapter = new OleDbDataAdapter();
OleDbCommand cmd = new OleDbCommand(command, dbConn);
cmd.Parameters.Add(value.ToString(), OleDbType.Integer, 2000, "ID");
for (int i = 2; i < dataGrid.ColumnCount; ++i)
{
cmd.Parameters.Add(" ", OleDbType.VarChar, 50, dataGrid.Columns[i].HeaderText);
}
dataAdapter.UpdateCommand = cmd;
cmd.ExecuteNonQuery();
dbConn.Close();
//SetUpThings();
//dataGrid.CurrentCell = this.dataGrid[0, countRow];
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
dbConn.Close();
}
}
创建上面使用的行命令的方法。
private String GetCreateRowCommand(int value)
{
String command = null;
command += "INSERT INTO " + Month + "(ID, ";
for (int i = 1; i < dataGrid.ColumnCount; ++i) //This for loop adds the field names from the header texts.
{
string temp = dataGrid.Columns[i].HeaderText;
if (i < dataGrid.ColumnCount - 1) //Until not last column, I need the commas.
command += temp + ", ";
else //if last row, add the closing bracket and values
command += temp + ") " + "VALUES(" + value + ", "; ;
}
for (int i = 1; i < dataGrid.ColumnCount; ++i)//This for loop adds a default of " " values to each cell. (It didn't work with nulls before).
{
if (i < dataGrid.ColumnCount - 1)
command += "' ', ";
else
command += "' ');";
}
return command; //returns a long ass command line, but unless I initalized them to some default value, the save method wasn't working.
}
我老老实实地想着如何以更简单的方式解决它。我是一个新手,我相信即使对于我上面所做的事情也应该有更简单的方法,但我现在知道的不是更好,这也很有效。 我尝试过像dataAdapter.Update(dataTable)这样的东西,但它只是因为原因而崩溃,或者根本没有做任何事情。我不确定我是否应该尝试dataAdapter.Dispose();或dataAdatper.Fill(dataTable);再次...
顺便说一句,新行被添加到MS-ACCESS数据库没有问题,如果我重新打开数据库,新行也将可见。但是如何在添加之后立即显示新行而不重新加载所有内容是我无法理解的。