2013-12-07 4 views
15

У меня было много вопросов, связанных с привязкой datagrid к datasource. У меня был DataGridView, к которому я устанавливаю DataSource из спискаДобавить строку после установки DataSource в Datagridview

List<Myclass> li = new List<MyClass>(); 

MyClass O = new MyClass(); 
O.Name = "Aden"; 
O.LastName = "B"; 
O.Id = 12; 
li.Add(O); 
O = new MyClass(); 
O.Name = "Li"; 
O.LastName = "S"; 
O.Id = 22; 
li.Add(O); 

Mydgv.DataSource = li; 

Где MyClass является

public Class MyClass 
{ 
public string Name {get; set;} 
public string LastName {get; set;} 
public decimal Id {get; set;} 
} 

теперь хотят, чтобы добавить новую строку в Мой DataGridView

DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone(); 
row.Cells[0].Value = "XYZ"; 
row.Cells[1].Value = 50.2; 
Mydgv.Rows.Add(row); 

Но это это невозможно, потому что Datasource of Datagrid привязан к списку li. Итак, мой первый вопрос: как я могу это сделать?

Мой второй вопрос: Для этого я сделал решение, чтобы изменить список List li и Добавить новую строку данных, а затем установить его в datasource datagrid, но я думаю, что это не приемлемое решение, решение?

Даже пытался сделать это CurrencyManager

CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[MyGrid.DataSource]; 
currencyManager1.SuspendBinding(); 
DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone(); 
row.Cells[0].Value = "XYZ"; 
row.Cells[1].Value = 50.2; 
Mydgv.Rows.Add(row); 
currencyManager1.ResumeBinding(); 

Как я знаю, что через него я подвесил Связывание DataGrid, чтобы обеспечить форматирование к сетке, как я выступал в одном из моего поста Make Row Visible false. Но почему это не работает здесь, добавляя строку в datagrid?

ответ

16

Попробуйте использовать BindingList вместо списка:

BindingList<MyClass> li = new BindingList<MyClass>(); 

Затем добавлять или удалять записи из самого списка:

li.Add(new MyClass() { Id = 15, LastName = "Z", Name = "Agent" }); 

и сетка автоматически покажет, что новая строка.

Чтобы иметь отдельные обновления свойств автоматически отображаются в сетке, то ваш класс должен реализовать INotifyPropertyChanged интерфейс:

public class MyClass : INotifyPropertyChanged { 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) { 
    if (PropertyChanged != null) { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    } 

и тогда ваше имущество придется поднять событие:

private string lastName = string.Empty; 

public string LastName { 
    get { return lastName; } 
    set { 
    if (value != lastName) { 
     lastName = value; 
     OnPropertyChanged("LastName"); 
    } 
    } 
} 

Теперь, если вы обновите строку из кода, сетка покажет, что обновление:

li[1].LastName = "Q"; 

См. Также Implementing INotifyPropertyChanged - does a better way exist?

2

Вот решение для добавления строк в источник данных после привязки к DataGridView.

Обратите внимание, что в форме я использовал пустой DataGridView «Mydgv» и кнопку «button1».

Также я использовал тот же «MyClass» из вашего вопроса.

Положите одну кнопку под названием «Button1» в форме и написать этот код

private void button1_Click(object sender, EventArgs e) 
    { 
     List<MyClass> li = (List<MyClass>)Mydgv.DataSource; 
     MyClass O = new MyClass(); 

     O.Name = "XYZ"; 
     O.LastName = "G"; 
     O.Id = new Random().Next(10, 100); 
     li.Add(O); 

     Mydgv.DataSource = li.ToList<MyClass>(); 
    } 

Нажмите на кнопку, и вы можете увидеть ваш DataGridView обновляется с новой строки.

Вместо того чтобы установить тот же объект List, что и DataSource, попробуйте список MyClass, как я заметил ниже.

Mydgv.DataSource = li.ToList <MyClass>();

Чтобы было легче понять, я ставлю Id как случайное число в диапазоне от 10 до 100.

Надеется, что вы проверить его и ответить мне, если есть какой-либо проблемы с кодом.

+0

Решение, которое я предложил, чтобы добавить новые строки в существующую границу DataGridView. Если вы хотите решить любую другую проблему, связанную с этим, сообщите мне. Я не получил ваше полное требование, кроме того, на которое я ответил, из вашего вопроса. – Anoop

+0

то, что вы сделали, это обновление DataGridView из списка по списку обновлений, но я хочу обновить свой datgrid, а не обновлять список, добавив строку в datagrid вручную. –

+0

В чем разница между этими способами. В любом случае вы хотите добавить новые строки в datagrid даже после привязки данных, и это будет сделано. Как только элемент управления привязан к базе данных, вы не можете обновить его представление. Для этого необходимо изменить исходные данные. – Anoop

0

Выполните Thos шаги ..

  1. создать свойство ObservableCollection из MyClass.

    private ObservableCollection<MyClass> _li; 
    
    public ObservableCollection<MyClass> Li 
    { 
        get; 
        set 
        { 
         _li = value; 
         NotifyPropertyChangedEvent("Li");  
        } 
    } 
    
  2. Bind DataGrid DataSource в собственность "Li" в XAML файле.

  3. Теперь, когда коллекция обновляется (например, элементы добавлены или удалены), DataSource автоматически обновится.

0

создать глобальную

List<Myclass> li = new List<MyClass>(); 

Out сторону Page_Load или какие-либо функции

Добавить/удалить любую строку из литий внутри любой функции и вызвать ниже линии при изменении данных в литии

gridview.DataSource=li; 
gridview.DataBind(); 
0

@Co. Aden

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

После вызова метода DataBind детали должны отображаться на сетке в соответствии с тем, что вы ожидали.

Mydgv.DataBind(); 

Образец для справки:

C#:

public partial class home : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     List<Student> students = new List<Student>(); 
     for (int i = 0; i < 10; i++) 
     { 
      students.Add(new Student(){FirstName = "First Name - " +i.ToString(),LastName = "Last Name - "+i.ToString()}); 
     } 
     students.Add(new Student() { FirstName = " ", LastName = " " }); 
     UsingDataSourceAndDataBind(students); 

    } 

    private void UsingDataSourceAndDataBind(List<Student> students) 
    { 
     GridView1.DataSource = students; 
     GridView1.DataBind(); 
    } 
} 

class Student 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

ASPX Код:

<body> 
<form id="form1" runat="server"> 
<div> 
    <asp:GridView ID="GridView1" runat="server"> 
    </asp:GridView> 
</div> 
</form> 

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