2009-12-09 1 views
3

Мой фон довольно много ASP.Net, и меня попросили разработать небольшое приложение для Windows. Я попытался использовать сетку для представления и выбора данных, и я жестко утверждал, что эквивалент в формах окон для GridView ASP.Net был DataGridView. Я не уверен, что если это так, в основном, в ASP.Net, у вас есть событие _RowCommand, связанное с сеткой, которое запускается после нажатия кнопки Commandbutton. Я также заметил, что не существует такого свойства, как свойство DataKeyNames, поэтому я не знаю, как передать текущий ключ строки нажатой кнопке. Любая помощь будет оценена, спасибо!Windows DataGridView _RowCommand

Я забыл упомянуть: Моя сетка имеет два типа DataGridViewButton колонн, И я не знаю, событие, которое мне нужно код на выполнения выбранной команды

+0

Обновление с примером, связанным с кнопками и привязкой данных –

ответ

0

Событие, которое вы ищите, это событие CellClick - с помощью DataGridViewButtonColumn вы фактически не связываете обработчики событий с конкретными кнопками, как с другими кнопками на вашей форме.

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

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
{   
    DataGridViewButton cell = (DataGridViewButtonCell) 
     dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; 

    // Any additional logic you want 
} 

Помимо этого, однако, я думаю, что вы действительно получаете выгоду от принятия шага назад и думать о различиях между WinForms и WebForms кодирования парадигм.

С помощью веб-форм многое из того, как вы кодируете, диктуется тем фактом, что все без гражданства. Это не относится к winforms, у вас есть состояние, и вы можете получить доступ к большинству элементов управления, когда вам нужно узнать информацию о них.

По этой причине получение информации, подобной выбранной ячейке в DataGridView, тривиально с winforms.

Кроме того, в большинстве случаев с winforms вам не нужны специальные кнопки для редактирования или удаления - вы можете редактировать непосредственно в сетке и использовать встроенные функции удаления (выберите строку и нажмите клавишу удаления).

Хорошее место, где вы можете пройти мимо некоторых ударов, может быть DataGridView FAQ. Это потрясающий ресурс для изучения DataGridView

+0

Спасибо за информацию. Теперь я чувствую, что с моей стороны это был глупый вопрос. Это помогает значительно, спасибо! – Edwin

+0

Добро пожаловать - не глупый вопрос. Я сам пришел из другого направления, перейдя из мира winforms в webforms и имел много одинаковых проблем, но наоборот. Рад, что смог помочь. –

0

DataGridView.CurrentRow Получает выбранную строку. Это то, что вам нужно?

+0

Смотрите мой комментарий ниже. Я все еще не знаю, в каком случае я должен проверить это свойство ... – Edwin

0

Если вы привязаны к базе данных, вы должны иметь (через .CurrentRow) доступ ко всем свойствам путем литья .CurrentRow.DataBoundItem в любой тип, в котором вы нуждаетесь. В противном случае просто посмотрите на ячейки или установите .Tag против строк при их добавлении.


Вот пример показывая связанные с данными DataGridView и пара кнопок, вытаскивая данные для выбранной строки:

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 
class Person 
{ 
    public string Name { get; set; } 
    [DisplayName("Eye Color")] 
    public string EyeColor { get; set; } 
} 
static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     using (var form = new Form()) 
     using (var grid = new DataGridView { Dock = DockStyle.Fill}) 
     using (var btn1 = new Button { Dock = DockStyle.Bottom, Text = "Button 1"}) 
     using (var btn2 = new Button { Dock = DockStyle.Bottom, Text = "Button 2" }) 
     { 

      btn1.Click += delegate 
      { 
       form.Text = "Button 1 clicked"; 
       if (grid.CurrentRow != null) 
       { 
        form.Text += ": " + ((Person)grid.CurrentRow.DataBoundItem).Name; 
       } 
      }; 
      btn2.Click += delegate 
      { 
       form.Text = "Button 2 clicked"; 
       if (grid.CurrentRow != null) 
       { 
        form.Text += ": " + ((Person)grid.CurrentRow.DataBoundItem).Name; 
       } 
      }; 
      form.Controls.Add(btn1); 
      form.Controls.Add(btn2); 
      form.Controls.Add(grid); 
      var data = new BindingList<Person> 
      { 
       new Person { Name = "Fred", EyeColor = "green"}, 
       new Person { Name = "Barney", EyeColor = "brown"}, 
       new Person { Name = "Wilma", EyeColor = "blue"}, 
       new Person { Name = "Betty", EyeColor = "blue"}, 
      }; 
      grid.DataSource = data; 
      Application.Run(form); 
     } 
    } 
} 

Есть и другие способы обработки с событиями щелчка и обычно многое из этого было бы сделано через конструктора, а не как это (но очень сложно показать код разработчика в фрагменте).

+0

Но какое событие я должен использовать для получения CurrentRow?Кроме того, я забыл упомянуть, есть два кнопки на datagrid, как узнать, была ли нажата кнопка «редактировать» или «удалить»? – Edwin

+0

Зацепив разные кнопки для разных обработчиков событий ... вы должны, как правило, только повторно использовать обработчик, если намерение одинаков. –

+0

Я использую привязку данных, то есть я не знаю, сколько строк будет иметь моя сетка. Можете ли вы дать мне указатель на то, как подключать события, когда данные сетки получены через .DataSource? – Edwin

Смежные вопросы