none
DataGridview 傳到 textbox RRS feed

  • 問題

  • 想請問各位大大 如何做出這樣的功能

    我在Form1 有2個textbox ,在form2有一個datagridview,裡面有客戶和地址
    想做出 每次我在form2的datagridview按一下裡面的value,會把value傳到form1的textbox裡面

    謝謝
    2015年6月15日 下午 06:32

解答

  • 0) 將Form1的TextBox的Modifiers設定成Internal

    1) 在Form2宣告Form1型態的變數

    2) 顯示Form2時填好Form2中Form1型態變數的內容值

    3) 在Form2時將DataGridView的內容值填入Form1的TextBox

    2015年6月16日 上午 09:09
  • 這個範例有以下假設:

    (1) 資料使用 DataTable , 我的習慣是會轉換成 List<T>, 考量你目前的狀況, 可能使用 DataTable 作範例會比較容易理解.

    (2) 可能不只有一個子表單會被更新, 所以這個範例會有一個主表單 (Form1), 兩個子表單 (Form2, Form3)

    (3) 我假設你懂得如何建立類別和介面, 如果你不是很清楚, 請找一些資料或書籍研讀一下

    (4) 一定要 Cell Click 才能更新子表單資料 (如果是只要移動DataGridView 的資料指標就改變就更簡單了)

    第一步 : 先建立資料來源類別 (這是一個模擬資料產生的類別)

       //模擬的資料類別
        public class Data
        {
            // 取得資料, 一般情形可能是從資料庫取得, 為求方便直接硬式編碼
            public DataTable GetData()
            {
                DataTable result = new DataTable();
                result.Columns.Add("Name", typeof(string));
                result.Columns.Add("Age", typeof(int));
                result.Columns.Add("Address", typeof(string));
    
                DataRow r1 = result.NewRow();
                r1["Name"] = "小叮噹";
                r1["Age"] = 18;
                r1["Address"] = "台北市";
                result.Rows.Add(r1);
                DataRow r2 = result.NewRow();
                r2["Name"] = "大雄";
                r2["Age"] = 12;
                r2["Address"] = "新竹市";
                result.Rows.Add(r2);
    
                return result;
            }
        }

    第二步: 建立一個給子表單實作的 IUpdater 介面

        //連動更新的 child Form 需實作此介面
        public interface IUpdater
        {
            void DataUpdate();
        }

    第三步: 建立一個中介服務者的類別, 用於建立資料來源與控制更新通知

        //中介服務者, 負責集中管理資料與通知更新
        public class Mediator
        {
            // 需要被更新畫面的 Form 列表
            public List<IUpdater> Updaters
            { get; set; }
            
            public BindingSource Source
            { get; set; }
    
            public Mediator()
            {
                Updaters = new List<IUpdater>();
                Source = new BindingSource();
                Data data = new Data();
                Source.DataSource  = data.GetData();
            }
        }


    第四步: 建立 Form2 (表單上有兩個 TextBox) 與 Form3 (表單上有一個 TextBox) 的內容, 包含實作 IUpdater, 修改建構函式, 並加入在關閉表單時從中介服務者移除的功能

      public partial class Form2 : Form, IUpdater
        {
            private Mediator mediator;
            private Form2()
            {
                InitializeComponent();
            }
    
            public Form2(Mediator mymediator)
                : this()
            {
                mediator = mymediator;
                // 將自己加入到中介服務者的列表中
                mediator.Updaters.Add(this);
            }
    
            // 實作 IUpdateter
            public void DataUpdate()
            {
                DataRowView data = (DataRowView)mediator.Source.Current;
                textBox1.Text = data["Name"].ToString();
                textBox2.Text = data["Age"].ToString();
            }
    
            //關閉 Form 時要將自己從中介服務者的列表中刪除
            private void Form2_FormClosed(object sender, FormClosedEventArgs e)
            {
                mediator.Updaters.Remove(this);
            }
        }


        public partial class Form3 : Form, IUpdater
        {
            private Mediator mediator;    
            private Form3()
            {
                InitializeComponent();
            }
    
            public Form3(Mediator mymediator)
                : this()
            {
                mediator = mymediator;
                // 將自己加入到中介服務者的列表中
                mediator.Updaters.Add(this);         
            }
    
            // 實作 IUpdateter
            public void DataUpdate()
            {
                DataRowView data = (DataRowView)mediator.Source.Current;
                textBox1.Text = data["Address"].ToString();
            }
    
            //關閉 Form 時要將自己從中介服務者的列表中刪除
            private void Form3_FormClosed(object sender, FormClosedEventArgs e)
            {
              mediator.Updaters.Remove(this); 
            }
        }

    第五步: 修改 Form1 的程式碼, 建立中介服務者, 並在 Form_Load 事件委派函式中新增 Form2與 Form3 的執行個體, 以及撰寫 DataGridView 的 CellClick 事件委派函式

        public partial class Form1 : Form
        {
            private Mediator mediator;
            public Form1()
            {
                InitializeComponent();
                // 產生中介服務者
                mediator  = new Mediator();
            }
         
            private void Form1_Load(object sender, EventArgs e)
            {
                dataGridView1.DataSource = mediator.Source; 
                //傳遞中介服務者給 Form2 執行個體
                Form2 f2 = new Form2(mediator);
                f2.Show();
                //傳遞中介服務者給 Form3 執行個體
                Form3 f3 = new Form3(mediator);
                f3.Show();
            }
    
            private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                // 取出中介服務者列表中所有的 Form , 呼叫其 DataUpdate 方法
                foreach (var item in mediator.Updaters  )
                {
                    item.DataUpdate();
                }
            }
        }


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。




    2015年6月18日 下午 07:49
    版主

所有回覆

  • 可以將 DataGridView 與 TextBox 做 DataBinding.add(...)
    2015年6月16日 上午 12:48
  • 0) 將Form1的TextBox的Modifiers設定成Internal

    1) 在Form2宣告Form1型態的變數

    2) 顯示Form2時填好Form2中Form1型態變數的內容值

    3) 在Form2時將DataGridView的內容值填入Form1的TextBox

    2015年6月16日 上午 09:09
  • 把資料歸資料, 畫面控制項歸畫面控制項, 不要再搞出這種全相依的形式出來了.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2015年6月16日 下午 12:01
    版主
  • 不太懂唉

    我的寫法能傳一欄

     private void ProductDetaildataGridView_CellClick(object sender, DataGridViewCellEventArgs e) 
     {

       if ((e.ColumnIndex < 0) || (e.RowIndex < 0)) return;
      ((TextBox)ParentControl1).Text = ProductDetaildataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();

     }

    如何回傳一列

     

    2015年6月17日 下午 04:10
  • 2015年6月18日 下午 01:46
  • 這個範例有以下假設:

    (1) 資料使用 DataTable , 我的習慣是會轉換成 List<T>, 考量你目前的狀況, 可能使用 DataTable 作範例會比較容易理解.

    (2) 可能不只有一個子表單會被更新, 所以這個範例會有一個主表單 (Form1), 兩個子表單 (Form2, Form3)

    (3) 我假設你懂得如何建立類別和介面, 如果你不是很清楚, 請找一些資料或書籍研讀一下

    (4) 一定要 Cell Click 才能更新子表單資料 (如果是只要移動DataGridView 的資料指標就改變就更簡單了)

    第一步 : 先建立資料來源類別 (這是一個模擬資料產生的類別)

       //模擬的資料類別
        public class Data
        {
            // 取得資料, 一般情形可能是從資料庫取得, 為求方便直接硬式編碼
            public DataTable GetData()
            {
                DataTable result = new DataTable();
                result.Columns.Add("Name", typeof(string));
                result.Columns.Add("Age", typeof(int));
                result.Columns.Add("Address", typeof(string));
    
                DataRow r1 = result.NewRow();
                r1["Name"] = "小叮噹";
                r1["Age"] = 18;
                r1["Address"] = "台北市";
                result.Rows.Add(r1);
                DataRow r2 = result.NewRow();
                r2["Name"] = "大雄";
                r2["Age"] = 12;
                r2["Address"] = "新竹市";
                result.Rows.Add(r2);
    
                return result;
            }
        }

    第二步: 建立一個給子表單實作的 IUpdater 介面

        //連動更新的 child Form 需實作此介面
        public interface IUpdater
        {
            void DataUpdate();
        }

    第三步: 建立一個中介服務者的類別, 用於建立資料來源與控制更新通知

        //中介服務者, 負責集中管理資料與通知更新
        public class Mediator
        {
            // 需要被更新畫面的 Form 列表
            public List<IUpdater> Updaters
            { get; set; }
            
            public BindingSource Source
            { get; set; }
    
            public Mediator()
            {
                Updaters = new List<IUpdater>();
                Source = new BindingSource();
                Data data = new Data();
                Source.DataSource  = data.GetData();
            }
        }


    第四步: 建立 Form2 (表單上有兩個 TextBox) 與 Form3 (表單上有一個 TextBox) 的內容, 包含實作 IUpdater, 修改建構函式, 並加入在關閉表單時從中介服務者移除的功能

      public partial class Form2 : Form, IUpdater
        {
            private Mediator mediator;
            private Form2()
            {
                InitializeComponent();
            }
    
            public Form2(Mediator mymediator)
                : this()
            {
                mediator = mymediator;
                // 將自己加入到中介服務者的列表中
                mediator.Updaters.Add(this);
            }
    
            // 實作 IUpdateter
            public void DataUpdate()
            {
                DataRowView data = (DataRowView)mediator.Source.Current;
                textBox1.Text = data["Name"].ToString();
                textBox2.Text = data["Age"].ToString();
            }
    
            //關閉 Form 時要將自己從中介服務者的列表中刪除
            private void Form2_FormClosed(object sender, FormClosedEventArgs e)
            {
                mediator.Updaters.Remove(this);
            }
        }


        public partial class Form3 : Form, IUpdater
        {
            private Mediator mediator;    
            private Form3()
            {
                InitializeComponent();
            }
    
            public Form3(Mediator mymediator)
                : this()
            {
                mediator = mymediator;
                // 將自己加入到中介服務者的列表中
                mediator.Updaters.Add(this);         
            }
    
            // 實作 IUpdateter
            public void DataUpdate()
            {
                DataRowView data = (DataRowView)mediator.Source.Current;
                textBox1.Text = data["Address"].ToString();
            }
    
            //關閉 Form 時要將自己從中介服務者的列表中刪除
            private void Form3_FormClosed(object sender, FormClosedEventArgs e)
            {
              mediator.Updaters.Remove(this); 
            }
        }

    第五步: 修改 Form1 的程式碼, 建立中介服務者, 並在 Form_Load 事件委派函式中新增 Form2與 Form3 的執行個體, 以及撰寫 DataGridView 的 CellClick 事件委派函式

        public partial class Form1 : Form
        {
            private Mediator mediator;
            public Form1()
            {
                InitializeComponent();
                // 產生中介服務者
                mediator  = new Mediator();
            }
         
            private void Form1_Load(object sender, EventArgs e)
            {
                dataGridView1.DataSource = mediator.Source; 
                //傳遞中介服務者給 Form2 執行個體
                Form2 f2 = new Form2(mediator);
                f2.Show();
                //傳遞中介服務者給 Form3 執行個體
                Form3 f3 = new Form3(mediator);
                f3.Show();
            }
    
            private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                // 取出中介服務者列表中所有的 Form , 呼叫其 DataUpdate 方法
                foreach (var item in mediator.Updaters  )
                {
                    item.DataUpdate();
                }
            }
        }


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。




    2015年6月18日 下午 07:49
    版主