2016-02-09 15 views
5

'a bir DataGridView koydum ve usergntrolümde datagridview sütunları özelliğini gösteren bir genel özellik oluşturun. UserControl içindeki DataGridView sütunları özelliğini açığa çıkarma düzgün çalışmıyor

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    public DataGridViewColumnCollection MyDataGridColumns 
    { 
     get 
     { 
      return dataGridView1.Columns; 
     } 
    } 
} 

Sonra benim formda UserControl1 ekleyip ben mülkiyet penceresinde MyDataGridColumns mülkiyet tıklayın ve 1 veya daha fazla sütun ekleyin:
İşte örnek kod verilmiştir. Sorunumu yeniden oluşturduğumda sorun olur; Yeni eklediğim sütunların tümü yeniden oluşturulduktan sonra kayboluyor.

Bunun neden olduğunu bana açıklayan var mı? ve nasıl çözülür?

+0

Sütunları nasıl ekliyorsunuz? Tasarım modunda mı yoksa programla mı? –

+0

Tasarım modunda. –

+0

Mülkinize 'MyDataGridColumns' için bir ayarlayıcı eklemeye çalışın. – Bioukh

cevap

4

Bu, benim için çalışır: DataGridView'u kapsamaz, herhangi bir denetim için varsayılan sütun düzenleyicisini kullanmak imkansız gibi göründüğü için belirli bir sütun düzenleyicisi oluşturdum.

public partial class UserControl1 : UserControl, IDataGridView 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    [Browsable(false)] 
    public DataGridView DataGridView 
    { 
     get { return dataGridView1; } 
    } 

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    [Editor(typeof(ExtendedDataGridViewColumnCollectionEditor), typeof(UITypeEditor))] 
    [MergableProperty(false)] 
    public DataGridViewColumnCollection MyDataGridColumns 
    { 
     get { return dataGridView1.Columns; } 
    } 

} 

public interface IDataGridView 
{ 
    DataGridView DataGridView { get; } 
} 

class ExtendedDataGridViewColumnCollectionEditor : UITypeEditor 
{ 
    private Form dataGridViewColumnCollectionDialog; 

    private ExtendedDataGridViewColumnCollectionEditor() { } 

    private static Form CreateColumnCollectionDialog(IServiceProvider provider) 
    { 
     var assembly = Assembly.Load(typeof(ControlDesigner).Assembly.ToString()); 
     var type = assembly.GetType("System.Windows.Forms.Design.DataGridViewColumnCollectionDialog"); 

     var ctr = type.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)[0]; 
     return (Form)ctr.Invoke(new object[] { provider }); 
    } 

    public static void SetLiveDataGridView(Form form, DataGridView grid) 
    { 
     var mi = form.GetType().GetMethod("SetLiveDataGridView", BindingFlags.NonPublic | BindingFlags.Instance); 
     mi.Invoke(form, new object[] { grid }); 
    } 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     if (provider != null && context != null) 
     { 
      var service = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); 
      if (service == null || context.Instance == null) 
       return value; 

      var host = (IDesignerHost)provider.GetService(typeof(IDesignerHost)); 
      if (host == null) 
       return value; 

      if (dataGridViewColumnCollectionDialog == null) 
       dataGridViewColumnCollectionDialog = CreateColumnCollectionDialog(provider); 

      //Unfortunately we had to make property which returns inner datagridview 
      //to access it here because we need to pass DataGridView into SetLiveDataGridView() method 
      var grid = ((IDataGridView)context.Instance).DataGridView; 
      //we have to set Site property because it will be accessed inside SetLiveDataGridView() method 
      //and by default it's usually null, so if we do not set it here, we will get exception inside SetLiveDataGridView() 
      var oldSite = grid.Site; 
      grid.Site = ((UserControl)context.Instance).Site; 
      //execute SetLiveDataGridView() via reflection 
      SetLiveDataGridView(dataGridViewColumnCollectionDialog, grid); 

      using (var transaction = host.CreateTransaction("DataGridViewColumnCollectionTransaction")) 
      { 
       if (service.ShowDialog(dataGridViewColumnCollectionDialog) == DialogResult.OK) 
        transaction.Commit(); 
       else 
        transaction.Cancel(); 
      } 
      //we need to set Site property back to the previous value to prevent problems with serializing our control 
      grid.Site = oldSite; 
     } 

     return value; 
    } 

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
} 
2

Bu, sütunun türünü belirtmediğiniz içindir. Bir sütun eklerken sütunun türünü vermelisiniz (örneğin DataGridViewTextBoxColumn veya DataGridViewCheckBoxColumn). Form1.cs'unuzda aşağıdakileri yapın:

public Form1() 
{ 
    InitializeComponent(); 
    DataGridViewColumn dgViewColumn = new DataGridViewTextBoxColumn();//Or DataGridViewCheckBoxColumn 
    dgViewColumn.DataPropertyName = "dgViewColumn"; 
    dgViewColumn.HeaderText = @"dgViewColumn"; 
    dgViewColumn.Name = "dgViewColumn"; 
    userControl11.MyDataGridColumns.Add(dgViewColumn); 
} 
+2

@Afshin Aghazadeh, Neden tasarımcıyı kullanmakta ısrar ediyorsun? Kod, tasarımcıdan daha fazla kontrol olanağı sunar. – Oceans