none
bindingsource.addnew之后怎样给datatable当前行赋一些初始值? RRS feed

  • 问题

  • bindingsource调用addnew()之后, 怎样给bindingsource绑定的datatable的当前行(刚刚新增的行)赋一些初始值? 也就是说怎样取得datatable新增的行对象?
    2010年2月26日 5:01

答案

  • 你好!

    我写了个完整的示例,你看看。

    using System;
    using System.Data;
    using System.Windows.Forms;
    
    namespace X.WinForms.UI.Controls.DataGridView
    {
        public partial class BindingSourceAddNew : Form
        {
            public BindingSourceAddNew()
            {
                InitializeComponent();
    
                this.InitData();
                this.InitUI();
            }
    
            private void BindingSourceAddNew_Load(object sender, EventArgs e)
            {
                this.AddDemo();
            }
    
            private System.Windows.Forms.DataGridView dataGridView1;
            private BindingSource bs;
            private DataTable dt;
    
            private void InitData()
            {
                this.dt = new DataTable();
    
                this.dt.Columns.Add("Id", typeof(Guid));
                this.dt.Columns.Add("Name", typeof(string));
    
                this.dt.Rows.Add(new object[] { Guid.NewGuid(), "Name1" });
                this.dt.Rows.Add(new object[] { Guid.NewGuid(), "Name2" });
    
                this.bs = new BindingSource(this.dt, null);
                this.bs.AddingNew += new System.ComponentModel.AddingNewEventHandler(AddingNew);
            }
    
            private void AddingNew(object sender, System.ComponentModel.AddingNewEventArgs e)
            {
                // 添加默认行的方式
                DataView view = (DataView)this.bs.List;
                DataRowView newobj = view.AddNew();
                newobj["Id"] = Guid.NewGuid();
                newobj["Name"] = "default";
                e.NewObject = newobj;
            }
    
            private void InitUI()
            {
                this.dataGridView1 = new System.Windows.Forms.DataGridView();
                this.dataGridView1.Dock = DockStyle.Fill;
                this.dataGridView1.DataSource = this.bs;
                this.Controls.Add(this.dataGridView1);
            }
    
            /// <summary>
            /// AddNew 测试
            /// </summary>
            private void AddDemo()
            {
                for (int i = 0; i < 5; i++)
                    this.bs.AddNew();
            }
        }
    }
    


    知识改变命运,奋斗成就人生!
    • 已建议为答案 SnakeWu 2010年3月1日 2:04
    • 已标记为答案 KeFang Chen 2010年3月4日 5:35
    2010年2月27日 1:39
    版主

全部回复

  • 你好!

    在 BindingSource.AddingNew 的事件中初始你需要的值。



    知识改变命运,奋斗成就人生!
    2010年2月26日 5:13
    版主
  • 谢谢你的回答, 我知道在里面写, 但是不知道怎么写, 不知道当前行对象怎么取得, 能不能写个例子?


    比如:
                      private   void   bsEmployees_AddingNew(object   sender,   AddingNewEventArgs   e)  
                      {   
                              ...

                              newRow["ID"]   =   1;
                              newRow["Name"]   =   "myname";  

                              ...
                      }

    那个newRow对象我怎么取得??
    2010年2月26日 9:05
  • 你好!
         通过设置e.NewObject属性来实现:
    void customersBindingSource_AddingNew(
        object sender, 
        AddingNewEventArgs e)
    {
        e.NewObject = DemoCustomer.CreateNewCustomer();
    }
    

    周雪峰
    2010年2月26日 9:27
    版主
  • 还是不明白,

    e.NewObject = DemoCustomer.CreateNewCustomer(); 是什么意思?
    新增的行对象怎么得到??? e.NewObject 就是我要的行对象吗?

    能不能帮我改一下下面的代码:
                      private   void   bsEmployees_AddingNew(object   sender,   AddingNewEventArgs   e)  
                      {   
                              ...

                              newRow["ID"]   =   1;
                              newRow["Name"]   =   "myname";  

                              ...
                      }

    在赋值之前我怎么得到 newRow 这个对象???

    2010年2月26日 9:46
  • 你好!
         意思就是你自己构造一个新行,然后赋初始值,然后把这个行赋值给e.NewObject!
    周雪峰
    2010年2月26日 10:10
    版主
  • 你好!

    我写了个完整的示例,你看看。

    using System;
    using System.Data;
    using System.Windows.Forms;
    
    namespace X.WinForms.UI.Controls.DataGridView
    {
        public partial class BindingSourceAddNew : Form
        {
            public BindingSourceAddNew()
            {
                InitializeComponent();
    
                this.InitData();
                this.InitUI();
            }
    
            private void BindingSourceAddNew_Load(object sender, EventArgs e)
            {
                this.AddDemo();
            }
    
            private System.Windows.Forms.DataGridView dataGridView1;
            private BindingSource bs;
            private DataTable dt;
    
            private void InitData()
            {
                this.dt = new DataTable();
    
                this.dt.Columns.Add("Id", typeof(Guid));
                this.dt.Columns.Add("Name", typeof(string));
    
                this.dt.Rows.Add(new object[] { Guid.NewGuid(), "Name1" });
                this.dt.Rows.Add(new object[] { Guid.NewGuid(), "Name2" });
    
                this.bs = new BindingSource(this.dt, null);
                this.bs.AddingNew += new System.ComponentModel.AddingNewEventHandler(AddingNew);
            }
    
            private void AddingNew(object sender, System.ComponentModel.AddingNewEventArgs e)
            {
                // 添加默认行的方式
                DataView view = (DataView)this.bs.List;
                DataRowView newobj = view.AddNew();
                newobj["Id"] = Guid.NewGuid();
                newobj["Name"] = "default";
                e.NewObject = newobj;
            }
    
            private void InitUI()
            {
                this.dataGridView1 = new System.Windows.Forms.DataGridView();
                this.dataGridView1.Dock = DockStyle.Fill;
                this.dataGridView1.DataSource = this.bs;
                this.Controls.Add(this.dataGridView1);
            }
    
            /// <summary>
            /// AddNew 测试
            /// </summary>
            private void AddDemo()
            {
                for (int i = 0; i < 5; i++)
                    this.bs.AddNew();
            }
        }
    }
    


    知识改变命运,奋斗成就人生!
    • 已建议为答案 SnakeWu 2010年3月1日 2:04
    • 已标记为答案 KeFang Chen 2010年3月4日 5:35
    2010年2月27日 1:39
    版主