web-dev-qa-db-ja.com

DataSourceをDatagridviewに設定した後に行を追加する

データグリッドのデータソースバインディングに関連する質問がたくさんありました。リストからデータソースを設定する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;}
}

My DataGridViewに新しい行を追加したい

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

ただし、DatagridのDatasourceがリストliでバインドされているため、エラーを発生させることはできません。だから私の最初の質問はどうすればこれを行うことができますか?

私の2番目の質問は、これを行うために、リストliを変更し、それにデータの新しい行を追加してから、データグリッドのデータソースに設定するソリューションを作成しましたが、それは実行可能なソリューションではないと思います。より良いソリューションはありますか?

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();

私が知っているように、私は自分の投稿の1つで実行したようにグリッドにフォーマットを提供するためにDataGridのバインドを一時停止しました Make Row Visible false 。しかし、なぜここでデータグリッドに行を追加しても機能しないのでしょうか。

15
Amit Bisht

Listの代わりに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";

INotifyPropertyChangedの実装-より良い方法はありますか? も参照してください。

17
LarsTech

DataGridViewにバインドされた後、データソースに行を追加するためのソリューションは次のとおりです。

フォームで空白のDataGridView「Mydgv」とボタン「button1」を使用していることに注意してください。

また、あなたの質問から同じ「MyClass」を使用しました。

フォームに「button1」という名前の1つのボタンを配置し、このコードを記述します

    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が新しい行で更新されていることがわかります。

DataSourceと同じListオブジェクトを設定する代わりに、以下で説明するようにMyClassのリストを試してください。

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

わかりやすくするために、IDを10から100までのランダムな数字にしています。

コードに問題がある場合は、確認して返信してください。

2
Anoop

この手順に従ってください。

  1. MyClassのObservableCollectionのプロパティを作成します。

    private ObservableCollection<MyClass> _li;
    
    public ObservableCollection<MyClass> Li
    {
        get; 
        set
        {
            _li = value;
            NotifyPropertyChangedEvent("Li");      
        }
    }
    
  2. DataGridDataSourceをXAMLファイルの「Li」プロパティにバインドします。

  3. これで、コレクションが更新される(つまり、アイテムが追加または削除される)たびに、データソースが自動的に更新されます。

0
Ravi Patel

@Co。アデン

データソースとしてリストをグリッドにバインドする最初の部分で行ったすべてを私が見るように、問題はありません。データソースを提供した後、databindメソッドを呼び出すのを逃した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>
0
Venkatesh Ellur

グローバルに作成

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

Page_loadまたは任意の関数の外側

関数内のliから任意の行を追加/削除し、liのデータを変更するときに以下の行を呼び出します

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