Ich habe ein Problem beim Zuweisen der DataSource
Propery auf einem DataGridView
Steuerelement. Mein DataSource
ist ein DataTable
's DefaultView
und, wie erwartet, Spalten werden automatisch in der DataGridView
erstellt, um mit denen in der DataTable
übereinzustimmen, wenn ich es zuweisen.DataGridView wiederholt Spalten neu erstellen
Was als nächstes passiert ist, dass die Spalten automatisch entfernt und erneut 2 mal durch die DataGridView
erstellt werden. Warum würde das passieren?
in einer Form Konstruktor:
//A DataTable is created with 5 columns
//The DataTable is populated with some rows.
myDgv.AutoGenerateColumns = true;
myDgv.DataSource = myDataTable.DefaultView;
// myDgv.ColumnAdded event is fired 5 times.
// WHY: myDgv.ColumnRemoved event is fired 5 times.
// WHY: myDgv.ColumnAdded event is fired 5 times.
// WHY: myDgv.ColumnRemoved event is fired 5 times.
// WHY: myDgv.ColumnAdded event is fired 5 times.
Edit: Hinzugefügt ein (hoffentlich) selbst Beispiel enthalten sind. Wenn ich Breakpoints in den Event-Handlern setze, drücke ich sechs Mal auf "Hinzugefügt" und einmal vier Mal auf "Entfernt". Die DataTable enthält 2 Spalten und ich fordere nie, dass Spalten in meinem Code entfernt werden.
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 asdasdgf
{
public class Form1 : Form
{
public Form1()
{
InitializeComponent();
DataTable dt = new DataTable();
dt.Columns.Add("Col1", typeof(int));
dt.Columns.Add("Col2", typeof(string));
foreach (int i in Enumerable.Range(0, 10))
{
var row = dt.NewRow();
row["Col1"] = i;
row["Col2"] = "stackoverflow";
dt.Rows.Add(row);
}
dataGridView1.ColumnAdded += new DataGridViewColumnEventHandler(dataGridView1_ColumnAdded);
dataGridView1.ColumnRemoved += new DataGridViewColumnEventHandler(dataGridView1_ColumnRemoved);
dataGridView1.DataSource = dt.DefaultView;
}
void dataGridView1_ColumnRemoved(object sender, DataGridViewColumnEventArgs e)
{
// Break here
}
void dataGridView1_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
{
// Break here
}
// Form1.Designer.cs contents:
#region Windows Form Designer generated code
private System.ComponentModel.IContainer components = null;
private System.Windows.Forms.DataGridView dataGridView1;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.dataGridView1 = new System.Windows.Forms.DataGridView();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.SuspendLayout();
//
// dataGridView1
//
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Location = new System.Drawing.Point(12, 41);
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.Size = new System.Drawing.Size(240, 150);
this.dataGridView1.TabIndex = 0;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 264);
this.Controls.Add(this.dataGridView1);
this.Name = "Form1";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
this.ResumeLayout(false);
}
#endregion
}
}
Was passiert, wenn Sie stattdessen eine BindingSource verwenden? –
Dasselbe passiert :-( – xyz
Ich habe ein (hoffentlich) eigenständiges Beispiel hinzugefügt. Wenn ich Haltepunkte in den Event-Handlern setze, drücke ich 6 Mal auf 'Added' und 4 Mal auf 'Removed'. Die DataTable enthält 2 Spalten und ich bitte nie um irgendwelche Spalten in meinem Code entfernt zu werden – xyz