none
如何將標題列某一儲存格設為連結 RRS feed

  • 問題

  • 問題一、請問如何將在DataGridView上的某一個標題列(ex:4),將它設為連結(or連線)

    ex:廠商名稱 在按下廠商名稱後會show出另一個Form

    現在目前只是單純的一個標題列....廠商名稱

    如果說的不清楚,請和我說,我在修改~~~~~~謝謝!!

    程式碼區塊

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Dim cmmd As New SqlClient.SqlCommand
            cmmd = New SqlClient.SqlCommand("SELECT  B_CprPInvertory.LocationID AS 物料格編號,A_Component.ComponentID AS 物料編號,B_CprPInvertory.DPNum AS 入庫數量,B_CprPInvertory.FormID AS 請購單編號,B_CprPInvertory.VendorName AS 廠商名稱,A_Component.UPrice AS 單價,B_CprPInvertory.BatchNo AS 批號,B_CprPInvertory.Remark AS 備註,A_Component.Component AS 物料名稱 FROM A_Component INNER JOIN B_CprPInvertory ON A_Component.ComponentID = dbo.B_CprPInvertory.ComponentID", cn)
            da.SelectCommand = cmmd
            da.Fill(ds, "B_CprPInvertory")
            ds.Tables("B_CprPInvertory").Clear()
            DataGridView1.Columns.Clear()
            'DataGridView1.DataSource = ds.Tables("B_CprPInvertory")


            '將BindingNavigator1和DataGridView1做聯繫
            bs.DataSource = ds.Tables("B_CprPInvertory")
            BindingNavigator1.BindingSource = bs
            DataGridView1.DataSource = bs

     

    問題二、

    在Form2,又要怎麼將游標點到的那列的第二行廠商名稱跑到Form1中的廠商名稱下的儲存格呢??

     

    如果說的不清楚,請和我說,我在修改~~~~~~謝謝!!
    2007年11月19日 上午 06:29

解答

  • 因為我沒有加上 e.RowIndex 的判斷阿...這其實還挺顯而易見的...

     

    程式碼區塊

    // 第一個欄位 AND 標題列

    if (e.ColumnIndex == 0 && e.RowIndex == -1)
    {
        Form2 f2 = new Form2();
        f2.Show();
    }

     

     

    2007年11月21日 上午 02:34

所有回覆

  • 程式碼區塊

    using System;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;

     

    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            private DataGridViewLinkColumn OrderID;

            public Form1()
            {
                InitializeComponent();

                OrderID = new DataGridViewLinkColumn();
                OrderID.DataPropertyName = "OrderID";
                OrderID.HeaderText = "OrderID";
                OrderID.Name = "OrderID";
                dataGridView1.Columns.AddRange(new DataGridViewColumn[] {OrderID});
            }

     

            private BindingSource bs = new BindingSource();

            private void Form1_Load(object sender, EventArgs e)
            {
                string strConn = ConfigurationManager.ConnectionStrings["NORTHWND"].ConnectionString;
                SqlConnection conn = new SqlConnection(strConn);

                conn.Open();

                DataSet ds = new DataSet();
                string sql = "SELECT * FROM Orders";
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                da.Fill(ds);

                conn.Close();

                bs.DataSource = ds.Tables[0];
                bindingNavigator1.BindingSource = bs;
                dataGridView1.DataSource = bs;
            }

     

            private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.ColumnIndex == 0)
                {
                    MessageBox.Show(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
                }
            }

        }
    }

     

     

    (1) 利用 DataGridViewLinkColumn  就可以建立連結...

         最重要的是 DataPropertyName  屬性...表示連結的資料庫欄位名稱

     

    (2) 點下內容的執行動作就要去處理 CellContentClick 事件...

         判斷被點的 Column 是否是你所要的...用 e.ColumnIndex

         事件內就自由發揮....

     

    2007年11月19日 上午 09:50
  •  

    VendorName = New DataGridViewLinkColumn()
            VendorName.DataPropertyName = "Name"
            VendorName.HeaderText = "廠商名稱"
            VendorName.Name = "Name"
            DataGridView1.Columns.AddRange(New DataGridViewColumnDesignTimeVisibleAttribute() {VendorName})

     

    紅色的字體出現錯誤!!

    錯誤 1 型別 'System.Windows.Forms.DataGridViewLinkColumn' 的值無法轉換成 'System.Windows.Forms.DataGridViewColumnDesignTimeVisibleAttribute'。 

     

     

    2007年11月20日 上午 02:18
  • 程式碼區塊

     Dim VendorName As DataGridViewLinkColumn

            VendorName = New DataGridViewLinkColumn()
            VendorName.DataPropertyName = "Name"
            VendorName.HeaderText = "廠商名稱"
            VendorName.Name = "Name"
            DataGridView1.Columns.Insert(4, VendorName)

     

     

    2007年11月20日 上午 02:32
  • 點你的 DataGridView -> 智慧標籤 -> 加入資料行 -> 自己填一填需要的欄位也可以

     

     

    2007年11月20日 上午 02:41
  • 恩.............

    請問為什麼會多一行"廠商名稱"呢?而且也沒有辦法連結的底線出現也??

    請問是否要加一句語法,才能在按下廠商名稱時跳出另一個Form(廠商資料)?

     

     

     

    2007年11月20日 上午 03:37
  •  
    程式碼區塊
    Dim VendorName As DataGridViewLinkColumn

            VendorName = New DataGridViewLinkColumn()
            VendorName.DataPropertyName = "Name"
            VendorName.HeaderText = "廠商名稱"
            VendorName.Name = "Name"

             VendorName.ActiveLinkColor = Color.White
             VendorName.LinkBehavior = LinkBehavior.SystemDefault
             VendorName.LinkColor = Color.Blue
             VendorName.TrackVisitedState = True
             VendorName.VisitedLinkColor = Color.YellowGreen


            DataGridView1.Columns.Insert(4, VendorName)

     

     

    若要回應使用者連結的點選作業,請處理 DataGridView.CellContentClick 事件。您也可以使用 DataGridView.CellClick 事件回應儲存格中任何地方的點選作業。
    2007年11月20日 上午 03:44
  • 我猜你忘記設定 DataPropertyName (對應的欄位)

     

    加入資料行後,記得去編輯你剛剛新增的資料行...

    2007年11月20日 上午 03:44
  •  

    DataGridView1.Columns.Insert(4, VendorName)
    這行是在在做插入行的指令,

    能不能將剛剛為廠商名稱 VendorName所作的那些命令change到原來的"廠商名稱裡"面嗎?

    因為用插入的方式,會導致我在其它地方對其它的行做的命令,出現問題。

     

    chhuang~~~~~~~~~~

    因為一開始我是用以下的程式去寫的,所以要是用 DataGridView -> 智慧標籤 -> 加入資料行

    這種方式的話,也會導致我在其它地方的指令有問題~~~~~(有試過這個方法!!)


     

    程式碼區塊

    Dim cmmd As New SqlClient.SqlCommand
            cmmd = New SqlClient.SqlCommand("SELECT  B_CprPInvertory.LocationID AS 物料格編號,A_Component.ComponentID AS 物料編號,B_CprPInvertory.DPNum AS 入庫數量,B_CprPInvertory.FormID AS 請購單編號,B_CprPInvertory.VendorName AS 廠商名稱,A_Component.UPrice AS 單價,B_CprPInvertory.BatchNo AS 批號,B_CprPInvertory.Remark AS 備註,A_Component.Component AS 物料名稱 FROM A_Component INNER JOIN B_CprPInvertory ON A_Component.ComponentID = dbo.B_CprPInvertory.ComponentID", cn)
            da.SelectCommand = cmmd
            da.Fill(ds, "B_CprPInvertory")
            ds.Tables("B_CprPInvertory").Clear()
            DataGridView1.Columns.Clear()

     

     '將BindingNavigator1和DataGridView1做聯繫
            bs.DataSource = ds.Tables("B_CprPInvertory")
            BindingNavigator1.BindingSource = bs
            DataGridView1.DataSource = bs

     

     

    2007年11月20日 上午 05:26
  • 1.   開啟  Form1.Designer.vb

     

    2.   將  原來的  Me.Column4 = New System.Windows.Forms.DataGridViewTextBoxColumn

         改成  Me.Column4 = New  System.Windows.Forms.DataGridViewLinkColumn()

     

           Me.Column4 .DataPropertyName = "Name"
            Me.Column4 .HeaderText = "廠商名稱"
            Me.Column4 .Name = "Name"

           Me.Column4 .ActiveLinkColor = Color.White
           Me.Column4 .LinkBehavior = LinkBehavior.SystemDefault
           Me.Column4 .LinkColor = Color.Blue
           Me.Column4 .TrackVisitedState = True
           Me.Column4 .VisitedLinkColor = Color.YellowGreen


     

     

    2007年11月20日 上午 05:39
  • 如果改成Me.Column4 = New System.Windows.Forms.DataGridViewLinkColumn()

    會出現錯誤錯誤 1 型別 'System.Windows.Forms.DataGridViewLinkColumn' 的值無法轉換成 'System.Windows.Forms.DataGridViewTextBoxColumn'。 

    相對的藍色的字

    Me.Column4.ActiveLinkColor = Color.White
    Me.Column4.LinkBehavior = LinkBehavior.SystemDefault
    Me.Column4.LinkColor = Color.Blue
    Me.Column4.TrackVisitedState = True
    Me.Column4.VisitedLinkColor = Color.YellowGreen

    會出現錯誤 不是 'System.Windows.Forms.DataGridViewTextBoxColumn' 的成員。 

    2007年11月20日 上午 06:09
  •  

    這一行

    Friend WithEvents Column4 As System.Windows.Forms.DataGridViewTextBoxColumn

     

    也要改成

    Friend WithEvents Column4 As System.Windows.Forms.DataGridViewLinkColumn

    2007年11月20日 上午 06:12
  • 如果你步驟正確的話應該不會有這種問題...

     

    直接把資料從 northwind 讀取出來...指定到 datagridview...如圖

    此時有一欄位叫 OrderID

     

     

    我利用智慧標籤新增一欄位 Column1...並指定 DataPropertyName 為 OrderID

     

     

     

    此時 OrderID 欄位會被 Column1 所取代....

     

    2007年11月20日 上午 06:20
  • chhuang~~~~~~~~~~

    不好意思,你誤會我的意思了!!

    我在剛開始就提過了,我只是要我的標題列(某一個儲存格)為連結的像這樣廠商名稱

    而非標題列下面的儲存格(行)

    不過你給的資料,也讓我知道怎麼用在標題行下的儲存格,謝謝!!

     

    2007年11月20日 上午 06:47
  • 去買別人發展的 Grid 元件,

    或者用和這篇類似的方法去改寫 DataGridViewColumn:

    http://msdn2.microsoft.com/en-us/library/aa480727.aspx

     

    2007年11月20日 上午 06:57
    版主
  • 程式碼區塊
    dataGridView1.EnableHeadersVisualStyles = false;
    dataGridView1.Columns[0].HeaderCell.Style.Font = new Font("Arial", 10, FontStyle.Underline);
    dataGridView1.Columns[0].HeaderCell.Style.ForeColor = Color.Blue;

     

     

    然後再處理 ColumnHeaderMouseClick or CellContentClick 事件....其實很多事件都可以...

    2007年11月20日 上午 07:27
  • 請問................

    可否針對ColumnHeaderMouseClick事件以程式的方式,說明讓我知道

    雖然已經看過了http://msdn2.microsoft.com/zh-tw/library/system.windows.forms.datagridview.columnheadermouseclick(VS.80).aspx

    但小妹的資質愚笨,還是寫不出來,所以在麻煩各位指導~~~~~~~~~~謝謝

     

     

    2007年11月20日 上午 08:48
  • 程式碼區塊

     

    private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
      Form1 f1 = new Form1();
      f1.Show();
    }

     

     

     

    2007年11月20日 下午 12:12
  • 以下是我另開一個程式寫的測試,在Form1的指令是可以成功執行的,但是還是有一點點小問題........

    現在按到標題列的時候是可以跑出"廠商Vendor"的Form,but.........

    不是在按到標題"廠商名稱"就會出現,現在只要按到的任一個列的標題欄位時,都可以跑出"廠商Form"

    有試過在CellContentClick設指令........如程式碼區塊3

    程式碼區塊

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    '廠商名稱做連結
            DataGridView5.EnableHeadersVisualStyles = False
            DataGridView5.Columns(4).HeaderCell.Style.Font = New Font("Arial", 10, FontStyle.Underline)
            DataGridView5.Columns(4).HeaderCell.Style.ForeColor = Color.Blue

     

     

    程式碼區塊

    Private Sub DataGridView5_CellContentClick(ByVal sender As System.Object, ByVal e As

     System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView5.CellContentClick

                  dim vendor as new vendor

                   vendor.show()

     

     

    假設將欄位4的顏色設和在Form1一樣的顏色時,廠商Form才會出現,但是執行的結果和程式碼區塊2是一樣的....

    程式碼區塊

    Private Sub DataGridView5_CellContentClick(ByVal sender As System.Object, ByVal e As

     System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView5.CellContentClick
            

            If DataGridView5.Columns(4).HeaderCell.Style.ForeColor = Color.Blue Then
                vendor.Show()
            End If

     

     

    請問我該如何在CellContentClick另外設定指令呢?
    2007年11月21日 上午 02:01
  • 因為我沒有加上 e.RowIndex 的判斷阿...這其實還挺顯而易見的...

     

    程式碼區塊

    // 第一個欄位 AND 標題列

    if (e.ColumnIndex == 0 && e.RowIndex == -1)
    {
        Form2 f2 = new Form2();
        f2.Show();
    }

     

     

    2007年11月21日 上午 02:34
  • 謝謝~~~~~~~~~~~~~~~chhuang、cmf

    之前會一直出現錯誤,好像是我的Form之前有設其它的程式去影響到的樣子,

    因為我在另外開一個新的Form測試時,你們給我的答案是可以執行的,

    所以干擾到的程式,我會在另外測試,問問題....

    再次感謝各位所以前輩~~~~~~~~~~~~~~~

     

    2007年11月21日 上午 02:51