DataGridView-Zelle mit Browse-Button  
Frank Dzaebel, erstellt am: 09.08.06, zuletzt geändert:  09.08.06
Kategorie: DataGridView, .NET-Version: 2.0, [Download]

Hier wird eine Bearbeitungsmöglichkeit für das DataGridView vorgestellt, bei der eine benutzerdefinierte Aktion nach Druck auf einen Button ausgeführt wird. Der Button erscheint nur bei Klick auf die DataGridView-Zelle und nur, wenn es die Link-Spalte ist:
 

Weiterführende MSDN-Beispiele:
- Beispiel für benutzerdefinierte DataGridView-Spalten (Hosten eines MaskedTextBox-Steuerelementes)
- Beispiel für das DataGridView-Steuerelement (u.a. Master/Detail, Hyperlinkspalte, ungebundene CheckBoxColumn)

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;
using System.Reflection;

namespace DgvButtonColumn
{
  public partial class Form1 : Form
  {
    public Form1() { InitializeComponent(); }

    DataSet1.DatenDataTable dt;
    DataGridView dgv;
    DataSet1 ds = new DataSet1();

    private void Form1_Load(object sender,EventArgs e)
    {
      dgv = new DataGridView(); dt = ds.Daten;
      dgv.Width = 500;
      dt.AddDatenRow("Dagobert Duck",true,1,"http://Dzaebel.NET");
      dt.AddDatenRow("Donald Duck",false,3,@"C:\AddIns.doc");
      dt.AddDatenRow("Gustav Gans",false,0,"http://www.Google.de");
      dt.AddDatenRow("Trick Duck",false,0,"ftp://strato.de");
      dgv.DataSource = dt;
      dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
      dgv.Location = new Point(15,15); this.Controls.Add(dgv);
      dgv.EditMode = DataGridViewEditMode.EditOnEnter;
      dgv.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dgv_EditingControlShowing);
    }

    void dgv_EditingControlShowing(object sender,DataGridViewEditingControlShowingEventArgs e)
    {
      if (dgv.CurrentCell.ColumnIndex != dt.LinkColumn.Ordinal) return;
      Button btn = new Button(); btn.Dock = DockStyle.Right;
      btn.Name = "btnOpen"; btn.Text = "..."; btn.Width = 25;
      if (!dgv.EditingPanel.Controls.ContainsKey(btn.Name))
        dgv.EditingPanel.Controls.Add(btn);
      btn.Click += new EventHandler(btn_Click);
      btn.BringToFront();
    }

    void btn_Click(object sender,EventArgs e)
    {
      Uri uri = new Uri(dgv.CurrentCell.Value.ToString());
      DialogResult res;
      if (uri.IsWellFormedOriginalString())
      {
        res = MessageBox.Show(uri.AbsoluteUri + " aufrufen?","Aufrufen ?",
          MessageBoxButtons.OKCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button1);
        if (res == DialogResult.OK)
        {
          Application.DoEvents();
          try { Process.Start(uri.AbsoluteUri); }
          catch (Exception exp) { dgv.CurrentRow.ErrorText = exp.Message; }
        }
        return;
      }
      OpenFileDialog ofd = new OpenFileDialog();
      ofd.FileName = dgv.CurrentCell.Value.ToString();
      ofd.CheckFileExists = false; ofd.CheckPathExists = false;
      ofd.ValidateNames = false; ofd.ShowReadOnly = true;
      res = ofd.ShowDialog();
      if (res != DialogResult.OK) return;
      Application.DoEvents(); 
      try { Process.Start(ofd.FileName); }
      catch (Exception exp){dgv.CurrentRow.ErrorText = exp.Message;}
    }
  }
}