對於我這樣一個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