如何使用 Entity Framework for Windows 表单向 Datagridview 动态添加新列
How to dynamically add a new column to a Datagridview using Entity Framework for Windows form
我的数据库对象是以下 class 使用 Sqlite。我可以使用下面的代码轻松地将此 class 绑定到 datagridview Windows 表单:
public partial class ClientSystemHardware
{
public int id { get; set; }
public int client_number { get; set; }
public string client_name { get; set; }
public string pc_manufacturer { get; set; }
public string pc_architecture { get; set; }
// etc…
}
clientHardwareEntities _dataObject = null;
private void LoadDataSource()
{
string dbName = GetDBName(1);
try
{
_dataObject = new clientHardwareEntities(dbName);
dataGV.DataSource = _dataObject.ClientSystemHardwares.ToList();
}
catch (Exception ex)
{
if (ex.InnerException != null)
{
MessageBox.Show(ex.InnerException.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void btnValidate_Click(object sender, EventArgs e)
{
try
{
dataGV.EndEdit();
_dataObject.SaveChanges();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
}
}
我正在使用 Entity Framework v6.3000 for .NET 4.0 和 System.Sqlite.dll
v1.0113。
我想动态添加一个新列,其中包含在使用 Entity framework 数据库上下文节省时不应干扰的行号。
你能给我一些指导吗?
不清楚网格数据源是什么类型。我假设它是来自 SQLite 的 DataTable
或 List<ClientSystemHardware>
。根据您的评论,我猜您想要一列……”其中包含行号” ……指的是网格中的“行”号。如果是这种情况,那么下面是一种可能的解决方案。
与其乱加一列,不如利用网格的 RowHeader
列。如果我们创建一个将每一行 header 设置为该行索引值的方法。这样我们就不必将列添加到网格中。此外,您可以将 AutoGenerateColumns
设置为 true
并删除手动添加列的代码。但是,您仍然需要一种方法来设置行 header 值,它可能类似于...
private void setRowHeaderValues() {
foreach (DataGridViewRow row in dataGridView1.Rows) {
if (!row.IsNewRow) {
row.HeaderCell.Value = (row.Index + 1).ToString();
}
}
}
我们可以在数据加载到网格后调用此方法...但是,有两个地方需要调用此代码以保持一致的顺序...1) 添加行时 2)当删除一行时。连接这两个方法后,我们就“不必”在加载或更改网格的数据源时调用该方法。
用于添加和删除行…
private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) {
setRowHeaderValues();
}
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
setRowHeaderValues();
}
将 DataGridView
连同按钮拖放到表单上,然后复制下面的代码来测试它。请注意,代码不会向网格中添加列。该代码使用数据库中的列。 …
DataTable GridTable;
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
GridTable = GetDataFromDB();
dataGridView1.DataSource = GridTable;
dataGridView1.RowHeadersWidth = 60;
}
private void setRowHeaderValues() {
foreach (DataGridViewRow row in dataGridView1.Rows) {
if (!row.IsNewRow) {
row.HeaderCell.Value = (row.Index + 1).ToString();
}
}
}
private DataTable GetDataFromDB() {
DataTable dt = new DataTable();
dt.Columns.Add("Col0", typeof(string));
dt.Columns.Add("Col1", typeof(string));
dt.Columns.Add("Col2", typeof(string));
for (int i = 0; i < 15; i++) {
dt.Rows.Add("C0R" + i, "C1R" + i, "C2R" + i);
}
return dt;
}
private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) {
setRowHeaderValues();
}
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
setRowHeaderValues();
}
private void button1_Click(object sender, EventArgs e) {
GridTable = GetDataFromDB();
dataGridView1.DataSource = null;
dataGridView1.DataSource = GridTable;
}
我的数据库对象是以下 class 使用 Sqlite。我可以使用下面的代码轻松地将此 class 绑定到 datagridview Windows 表单:
public partial class ClientSystemHardware
{
public int id { get; set; }
public int client_number { get; set; }
public string client_name { get; set; }
public string pc_manufacturer { get; set; }
public string pc_architecture { get; set; }
// etc…
}
clientHardwareEntities _dataObject = null;
private void LoadDataSource()
{
string dbName = GetDBName(1);
try
{
_dataObject = new clientHardwareEntities(dbName);
dataGV.DataSource = _dataObject.ClientSystemHardwares.ToList();
}
catch (Exception ex)
{
if (ex.InnerException != null)
{
MessageBox.Show(ex.InnerException.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void btnValidate_Click(object sender, EventArgs e)
{
try
{
dataGV.EndEdit();
_dataObject.SaveChanges();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
}
}
我正在使用 Entity Framework v6.3000 for .NET 4.0 和 System.Sqlite.dll
v1.0113。
我想动态添加一个新列,其中包含在使用 Entity framework 数据库上下文节省时不应干扰的行号。
你能给我一些指导吗?
不清楚网格数据源是什么类型。我假设它是来自 SQLite 的 DataTable
或 List<ClientSystemHardware>
。根据您的评论,我猜您想要一列……”其中包含行号” ……指的是网格中的“行”号。如果是这种情况,那么下面是一种可能的解决方案。
与其乱加一列,不如利用网格的 RowHeader
列。如果我们创建一个将每一行 header 设置为该行索引值的方法。这样我们就不必将列添加到网格中。此外,您可以将 AutoGenerateColumns
设置为 true
并删除手动添加列的代码。但是,您仍然需要一种方法来设置行 header 值,它可能类似于...
private void setRowHeaderValues() {
foreach (DataGridViewRow row in dataGridView1.Rows) {
if (!row.IsNewRow) {
row.HeaderCell.Value = (row.Index + 1).ToString();
}
}
}
我们可以在数据加载到网格后调用此方法...但是,有两个地方需要调用此代码以保持一致的顺序...1) 添加行时 2)当删除一行时。连接这两个方法后,我们就“不必”在加载或更改网格的数据源时调用该方法。
用于添加和删除行…
private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) {
setRowHeaderValues();
}
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
setRowHeaderValues();
}
将 DataGridView
连同按钮拖放到表单上,然后复制下面的代码来测试它。请注意,代码不会向网格中添加列。该代码使用数据库中的列。 …
DataTable GridTable;
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
GridTable = GetDataFromDB();
dataGridView1.DataSource = GridTable;
dataGridView1.RowHeadersWidth = 60;
}
private void setRowHeaderValues() {
foreach (DataGridViewRow row in dataGridView1.Rows) {
if (!row.IsNewRow) {
row.HeaderCell.Value = (row.Index + 1).ToString();
}
}
}
private DataTable GetDataFromDB() {
DataTable dt = new DataTable();
dt.Columns.Add("Col0", typeof(string));
dt.Columns.Add("Col1", typeof(string));
dt.Columns.Add("Col2", typeof(string));
for (int i = 0; i < 15; i++) {
dt.Rows.Add("C0R" + i, "C1R" + i, "C2R" + i);
}
return dt;
}
private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) {
setRowHeaderValues();
}
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
setRowHeaderValues();
}
private void button1_Click(object sender, EventArgs e) {
GridTable = GetDataFromDB();
dataGridView1.DataSource = null;
dataGridView1.DataSource = GridTable;
}