2011-10-27 17 views
8

C'è un modo per aggiungere un controllo (ad esempio un pulsante) a una cella DataGridView di Winform in C#?Aggiunta di un pulsante a un Winforms DataGridView

(Quello che sto puntando a sta mettendo vari tipi di controlli in diverse celle della griglia ...)

+0

http://stackoverflow.com/questions/6085930/add-button-column-in-a-databound-datagridview –

risposta

6

si può fare in questo modo ....

Ci sono due modi per farlo:

  • 1). Trasmetti DataGridViewCell a un certo tipo di cella esistente. Per esempio , convertire un DataGridViewTextBoxCell in tipo DataGridViewComboBoxCell.
  • 2). Creare un controllo e aggiungerlo alla raccolta di controlli di DataGridView, impostarne la posizione e le dimensioni per adattarlo alla cella che deve essere l'host .

Vedere il seguente codice di esempio che illustra i trucchi.

frammento di codice

private void Form5_Load(object sender, EventArgs e) 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("name"); 
     for (int j = 0; j < 10; j++) 
     { 
      dt.Rows.Add(""); 
     } 
     this.dataGridView1.DataSource = dt; 
     this.dataGridView1.Columns[0].Width = 200; 

     /* 
     * First method : Convert to an existed cell type such ComboBox cell,etc 
     */ 

     DataGridViewComboBoxCell ComboBoxCell = new DataGridViewComboBoxCell(); 
     ComboBoxCell.Items.AddRange(new string[] { "aaa","bbb","ccc" }); 
     this.dataGridView1[0, 0] = ComboBoxCell; 
     this.dataGridView1[0, 0].Value = "bbb"; 

     DataGridViewTextBoxCell TextBoxCell = new DataGridViewTextBoxCell(); 
     this.dataGridView1[0, 1] = TextBoxCell; 
     this.dataGridView1[0, 1].Value = "some text"; 

     DataGridViewCheckBoxCell CheckBoxCell = new DataGridViewCheckBoxCell(); 
     CheckBoxCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter; 
     this.dataGridView1[0, 2] = CheckBoxCell; 
     this.dataGridView1[0, 2].Value = true; 

     /* 
     * Second method : Add control to the host in the cell 
     */ 
     DateTimePicker dtp = new DateTimePicker(); 
     dtp.Value = DateTime.Now.AddDays(-10); 
     //add DateTimePicker into the control collection of the DataGridView 
     this.dataGridView1.Controls.Add(dtp); 
     //set its location and size to fit the cell 
     dtp.Location = this.dataGridView1.GetCellDisplayRectangle(0, 3,true).Location; 
     dtp.Size = this.dataGridView1.GetCellDisplayRectangle(0, 3,true).Size; 
    } 
+1

Mentre il secondo metodo visualizza il controllo, rimane statico quando le celle vengono scorse: esiste un modo per bloccare il nuovo controllo nella cella sottostante? – CrazyHorse

+0

Il primo metodo ha funzionato bene, il secondo causa il "ricadere" del controllo della griglia durante lo scorrimento. Immagino che potresti usare l'evento format per spostarlo di nuovo. –

6

Il DataGridViewButtonColumn è un tipo di colonna a condizione che contiene un pulsante cliccabile. È possibile aggiungere i propri controlli alle celle:

http://msdn.microsoft.com/en-us/library/7tas5c80.aspx

Tenete a mente che non è sempre banale, ma ho visto che qualcuno ha messo un intero DataGridView in una cella - sembrava strano.

ci sono anche altre colonne previste:

DataGridViewButtonColumn 
DataGridViewCheckBoxColumn 
DataGridViewComboBoxColumn 
DataGridViewImageColumn 
DataGridViewLinkColumn 
DataGridViewTextBoxColumn 

È possibile modificare queste nell'editor di colonna nella finestra di progettazione in Visual Studio, o aggiungere nel codice per la raccolta Colonne.

+0

Ah , quindi stai dicendo che posso aggiungere QUALSIASI tipo di controllo in un oggetto DataGridViewButtonColumn? Quando mi sono imbattuto in questo ho pensato che fosse una colonna piena di pulsanti ;-) – Boris

+0

@ Boris No alla colonna Button, puoi creare un tipo di colonna che ospita qualsiasi controllo e aggiungere quel tipo di colonna alla griglia. Ad esempio, potresti creare una DataGridViewNumericUpDownColumn che ospita un controllo NumericUpDown. La colonna è codificata per ospitare un particolare tipo di controllo, non è una decisione runtime. –

+0

Ma penso ci sia ancora un fraintendimento: con questo approccio, l'intera colonna ottiene lo stesso tipo di controllo? Perché quello che mi piacerebbe avere è un diverso tipo di controllo in ogni cellula. – Boris

-1

vorrei aggiungere che nella finestra di progettazione e fare un campo modello. Un modo semplice per andare a mettere tutto quello che vuoi nella datagridview

Esempio

<asp:DataGrid ID="somedatagrid" runat="server"> 
    <Columns> 
     <asp:TemplateColumn> 
      <ItemTemplate> 
       <asp:Button ID="somebutton" runat="server" Text="some button" /> 
      </ItemTemplate> 
     </asp:TemplateColumn> 
    </Columns> 
</asp:DataGrid> 
+0

Sfortunatamente la domanda riguardava le winform, non le pagine Web .NET. – Zorgarath

Problemi correlati