2013-05-09 2 views
0

Возможно, сложный вопрос - но есть надеждаСоздать Детали формы из GridView C#

У меня есть общие данные сетки на одной форме (отображает любую таблицу, я хочу из набора данных) путем простой замены таблиц в наборе данных ,

Я хочу дважды щелкнуть по данной записи и отобразить однозадачное представление данных таблицы с текущей выбранной записью, отображаемой по умолчанию, но с возможностью просмотра страницы и редактирования/просмотра/удаления других записей, т. Е.

Я хочу автоматически создать форму представления подробностей из datagrid для данной таблицы во время выполнения. Форма должна быть динамически создана - отображение набора данных в подробном представлении с возможностью перехода по одиночным записям с использованием источника привязки источника/привязки источника привязки.

Моя цель состоит в том, чтобы повысить эффективность/поддерживаемость приложения - вместо того, чтобы создавать и управлять 10 + формами, я просто хочу создать и управлять формой общих данных, так же как я управляю формой общего вида gridview.

До сих пор я придумал:

общественный недействительный CreateDetailsForm (BindingSource бс, внутр rowClicked) { Форма detailsForm = новая форма();

 BindingSource newFormBS = new BindingSource(); 

     //assign binding source for use on new detailsForm 
     newFormBS = bs; 

     //assign binding source to datatable 
     DataTable dt = (DataTable)bs.DataSource; 

     //create the form fields 
     CreateFormFields(dt); //not yet implemented 

     //assign form fields to form 

     //display form 

}

Любой помощь на следующем оценил

  1. Генерации и назначение полой формы в форму.

Заранее спасибо.

ответ

0

она любит:

Form f=new Form(); 

     TextBox t=new TextBox();//generate the controls u need 
     t.Text = "test";//set the actual value 
     t.Location=new Point(10,10); 
     f.Controls.Add(t); 

     DialogResult dr=f.ShowDialog(); 
+0

Спасибо - использовали этот код для создания формы с текстовыми полями и ярлыками - теперь все, что мне нужно сделать, это выяснить, как привязать элементы управления к форме к источнику привязки. – user2354374

+0

Приветствую вас, я думаю, что вы можете создать элемент управления datagridview или что-то вроде списка, чтобы отобразить ваш источник данных. – Nate

0

До сих пор я получил имена Col, сгенерированные на форме следующим образом

Список COLNAMES = GetColumnNames (DT);

 int offset=25; 
     int xPos=50; 
     int yPos = 10; 
     foreach (string name in colNames) 
     { 
      Label l = new Label(); 
      l.Name = name; 
      l.Width = 200; 
      l.Text = name; 


      TextBox t = new TextBox(); 
      t.Name = name; 
      t.Width=200; 

      l.Location = new Point(xPos, yPos); 
      t.Location = new Point(xPos+250, yPos); 


      f.Controls.Add(l); 
      f.Controls.Add(t); 

      yPos = yPos + offset; 
     } 
     //TextBox t = new TextBox();//generate the controls u need 
     //t.Text = "test";//set the actual value 


     f.Width = 800; 
     f.Height = 600; 
     f.Show(); 


    } 

    private List<string> GetColumnNames(DataTable table) 
    { 
     List<string> lstColNames=new List<string>(); 

     if (table != null) 
     { 

      lstColNames= 

       (from DataColumn col in table.Columns 

       select col.ColumnName).ToList(); 



     } 

     return lstColNames; 



    } 

Теперь, пытаясь работать, чтобы привязать элементы управления к источнику привязки!

+0

. Теперь мы разработали операцию привязки для одной записи, но работаем над всей таблицей, доступной // операция привязки t.DataBindings.Add (новое связывание («Текст», bs, t.Name, true)); – user2354374

0

OK - получили его работы сейчас - пришлось взять другой подход

  1. создал единую DetailsView форму
  2. Создан статический класс называется PassBindingSource со статическим BST собственности для прохождения связывания источника из GridView в подробнее форма

    статический класс PassBindingSource { public static BindingSource bst {get; задавать; } }

  3. На форме DetailsView добавлен следующий код

    try{ bs.DataSource = PassBindingSource.bst; 
    
    DataTable dt = (DataTable)PassBindingSource.bst.DataSource; 
    
    
    List<string> colNames = GetColumnNames(dt); 
    
    int offset = 25; 
    int xPos = 50; 
    int yPos = 50; 
    
    foreach (string name in colNames) 
    { 
    Label l = new Label(); 
    l.Name = name; 
    l.Width = 200; 
    l.Text = name; 
    
    
    TextBox t = new TextBox(); 
    t.Name = name; 
    t.Width = 200; 
    
    // BindingOperations.SetBinding(t, t.TextProperty, bs); 
    
    //binding operation 
    t.DataBindings.Add(new Binding("Text", bs, t.Name, true)); 
    
    l.Location = new Point(xPos, yPos); 
    t.Location = new Point(xPos + 250, yPos); 
    
    
    this.Controls.Add(l); 
    this.Controls.Add(t); 
    
    yPos = yPos + offset; 
    
    // dgDetailsView.DataSource = bs; 
    } 
    //move to correct record in binding source 
         bs.Position = PassBindingSource.currentRecord; 
    } 
    catch (Exception ex) 
    { 
    MessageBox.Show(ex.Message); 
    } 
    
    
    
    } 
    
    
    
    private List<string> GetColumnNames(DataTable table) 
    { 
    List<string> lstColNames=new List<string>(); 
    
    if (table != null) 
    { 
    
         lstColNames= 
    
         (from DataColumn col in table.Columns 
    
         select col.ColumnName).ToList(); 
    
    
    } 
    
    return lstColNames; 
    
    
    
    } 
    

СУЩНОСТЬ Теперь все работает - элементы управления DetailsView, генерируемые во время выполнения проводной правильно к источнику связывания и datagrid может вызвать этот detailView в любое время, используя любую таблицу из набора данных, проводя двойной щелчок по событию сетки со следующим кодом:

PassBindingSource.bst= bs; 
frmDetailsView nf = new frmDetailsView(); 
nf.Show(); 

Надеюсь, это поможет другим. Большое спасибо User2354374 за начальное руководство.