C# datagridviewcomboxcolumn資料的綁定與值的顯示

來源:互聯網
上載者:User

     對於我這樣一個C#菜鳥,啥都不會,啥都得在網上找資料,一點一滴的學,很困難,所以把自己學習過程中遇到的一些兒問題記錄於此,便於自己複查,也便於其它同仁學習。

     在一個datagridview中有一列,我想做成下拉的,這樣可以讓使用者從在選定某個值,經過自己慢慢嘗試終於搞定,記錄如下:

想實現的功能如下:

開啟這個許可權管理的介面後,我可以更改使用者的角色(角色是已經在另外一個介面中設定好的),當我選中左側的某個角戶或角色時,相應的使用者名稱和角色名稱將顯示在右側上方的對應textbox處;

資料為表:

       使用者表:User (UserID, UserName) (注:還有其它列,與此處無關,便不提) 

       角色表:Role(RoleID, RoleName)

       使用者與角色實體關聯:一個使用者只屬於一個角色,一個角色有多個使用者。

      

     在datagridview中開啟列編輯器如下:

設定ColumnType的屬性如,設定DisplayStyle為DropDownButton(這樣只有下拉,而使用者不可輸入),比較重要的是將ReadOnly屬性設為false,要不綁定資料後,使用者將無法選擇繫結資料!!如果沒有設定預設值,則使用者將看不到資料也不能更改!在這個問題上讓我糾結了好久!

      相關代碼如下:

               //綁定角色資訊到datagridviewcomboxcolumn列中,該列的列名為roleName
                RoleManage roleMan = new RoleManage();
                DataSet roleDataSet = roleMan.GetRoleInfo("");//擷取角色資訊
                roleName.DataSource = roleDataSet.Tables[0]; //roleName為datagridview中角色列的列名。設定資料來源
                roleName.DisplayMember = "RoleName";//設定格式化的值的資料來源,即在使用者看到的下拉文本來自資料庫表的列,這裡資料庫表列名為RoleName

                roleName.ValueMember = "RoleID";//設定下拉文本對應的真實值的資料來源。

                綁定使用者資訊到datagridview中,在datagridview相應的列已經設定了DataPropertyName屬性,屬性值與資料庫表中的列名相同,這樣當綁定資料來源後,datagridview能將資料庫中相應的列顯示出來。

                UserManage userMan = new UserManage();
                DataSet userDataSet = userMan.GetUserInfo(""); //擷取使用者資訊

                uRPRelationDataGridView.DataSource = userDataSet.Tables[0];//設定資料來源

 

                顯示使用者預設的角色

int roleIDTmp;
                UserRolePowerRelationManage uRPRMan = new UserRolePowerRelationManage();
                for (int i = 0; i < uRPRelationDataGridView.Rows.Count; i++ )
                {
                    roleIDTmp = uRPRMan.GetRoleByUserID(Convert.ToInt32(uRPRelationDataGridView.Rows[i].Cells["UserID"].Value.ToString()));//確定使用者的角色,如果還沒有給該使用者指派角色,則其角色查到的角色ID為-1
                    uRPRelationDataGridView.Rows[i].Cells["roleID"].Value = roleIDTmp.ToString();//將使用者的角色ID顯示在datagridview的角色ID列中,該列的列名為roleID
                    if (roleIDTmp != -1)//如果還沒有為該使用者指派角色,則讓角色名稱為空白。
                    {
                           uRPRelationDataGridView.Rows[i].Cells["roleName"].Value= roleIDTmp; //將使用者所屬的角色名稱選中(該儲存格的值是角色ID,顯示的是角色名稱),這裡即是設定datagridviewcomboxcolumn列預設的顯示文本。(選中了該儲存格的真實值,將自動顯示其對應的文本,即在這裡有一個映射過程)
                           //MessageBox.Show(uRPRelationDataGridView.Rows[i].Cells["roleName"].FormattedValue.ToString());

                          //這裡uRPRelationDataGridView.Rows[i].Cells["roleName"].FormattedValue.ToString()即是當前datagridviewcomboxcolumn列(在這裡為roleName列)顯示的文本!!對於datagridview其它不是下拉的列,其儲存格的值(value)與格式化的值(顯示給使用者看的值)(FormattedValue)相同
                    }
                }//for (int i = 0; i < uRPRelationDataGridView.Rows.Count; i++ )     

         

         接下來是將選中的行的角色名稱顯示在右側的textbox當中,這需要用到幾個事件,相關代碼如下:

        //在 DataGridView 控制項中的目前的儲存格更改或者該控制項接收到輸入焦點時發生。
        //如果該控制項沒有輸入焦點,並且單擊的儲存格以前不是目前的儲存格,則此事件可能會在一次單擊中出現兩次。
        private void uRPRelationDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (uRPRelationDataGridView.CurrentRow != null)
            {
                object formattedValue = uRPRelationDataGridView.CurrentRow.Cells["roleName"].FormattedValue;
                object value = uRPRelationDataGridView.CurrentRow.Cells["roleName"].Value;
                if (formattedValue != null && value != null)
                {
                    //int roleIDTmp = Convert.ToInt32(uRPRelationDataGridView.CurrentRow.Cells["roleName"].Value.ToString().Trim());//擷取當前選中的角色ID
                    roleNameTextBox.Text = uRPRelationDataGridView.CurrentRow.Cells["roleName"].FormattedValue.ToString();                    
                }
                else
                {
                    roleNameTextBox.Text = "";
                }
            }
        }//private void uRPRelationDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)

 

       //該事件在使用者指定的值提交時發生,使用者指定的值通常是在焦點離開儲存格時提交。
        private void uRPRelationDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (uRPRelationDataGridView.CurrentRow != null)
            {
                if (uRPRelationDataGridView.CurrentRow.Cells["roleName"].FormattedValue != null)
                {
                    roleNameTextBox.Text = uRPRelationDataGridView.CurrentRow.Cells["roleName"].FormattedValue.ToString();
                    //uRPRelationDataGridView.CurrentRow.Cells["roleID"].Value = uRPRelationDataGridView.CurrentRow.Cells["roleName"].Value;
                }
            }
        }//private void uRPRelationDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)

 

      //當儲存格的內容已更改,但更改尚未儲存時,該儲存格將標記為已修改。
        //此事件通常會在以下情況下發生:當儲存格已編輯,但是更改尚未提交到資料緩衝中時,或者當編輯操作被取消時。
        private void uRPRelationDataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
        {
            if (uRPRelationDataGridView.IsCurrentCellDirty)//IsCurrentCellDirty值指示目前的儲存格是否有未認可的變更,如果有則為true
            {
                uRPRelationDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);//將目前的儲存格中的更改提交到資料緩衝,但不結束編輯模式。這個將觸發CellValueChanged事件
            }
        }

 

 參考文檔:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridviewcell.formattedvalue.aspx

                  

http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridview_events(v=vs.80).aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.