【DevExpress中文教程】在GridView中動態創建列時如何綁定不同編輯處理控件

在使用DevExpress GridView時,爲了方便往往使用一些擴展函數,動態創建GridView列的編輯控件對象,然後我們可以靈活的對內容進行編輯或者使用一些彈出的對話框窗體進行處理內容的錄入,本文就是介紹這一主題:在DevExpress的GridView的列中,動態創建列的時候,綁定不同的編輯處理控件。

DevExpress擁有.NET開發需要的所有平臺控件,包含600多個UI控件、報表平臺、DevExpress Dashboard eXpressApp 框架、適用於 Visual Studio的CodeRush等一系列輔助工具。

DevExpress技術交流羣8:523159565      歡迎一起進羣討論

1. 使用擴展函數動態創建列

我們創建列,爲了綁定相應的數據源信息展示,一般指定列的名稱和顯示的列標題名稱,如下是一個簡單的列創建處理代碼。

grv.CreateColumn("Note", "備註說明");

如果贏綁定了數據源,我們也可以根據列的FieldName進行獲得列的控制權,然後給它指定不同的編輯控件,如下所示。

gridview.Columns.ColumnByFieldName("Introduction").CreateMemoEdit();

上面的CreateMemoEdit()函數就是一個簡單的擴展函數,用於創建一個備註列的處理,它的編輯器控件 RepositoryItemMemoEdit 的RepositoryItem 擴展對象,擴展函數如下所示的代碼。

/// <summary>
/// 創建GridView的列編輯爲MemoEdit
/// </summary>
/// <param name="gridColumn">GridColumn列對象</param>
/// <returns></returns>
public static RepositoryItemMemoEdit CreateMemoEdit(this GridColumn gridColumn)
{
RepositoryItemMemoEdit repositoryItem = new RepositoryItemMemoEdit
{
AutoHeight = false,
LinesCount = 0
};
gridColumn.View.GridControl.RepositoryItems.Add(repositoryItem);
gridColumn.ColumnEdit = repositoryItem;
return repositoryItem;
}

我們把它們(這些擴展函數)定義在不同的類文件中,使用靜態類就可以了。例如對於GridControl和GridView的相關處理擴展函數,把它整理放在一個類文件中,定義各種方便使用的方法即可,如下所示。

【DevExpress中文教程】在GridView中動態創建列時如何綁定不同編輯處理控件

對於一些簡單的錄入我們保留讓他使用默認文本輸入框即可,如下所示代碼。

this.gridViewRequisition.CreateColumn("需求金額", "需求金額", 80);
this.gridViewRequisition.CreateColumn("採購數量", "採購數量", 80);
this.gridViewRequisition.CreateColumn("採購金額", "採購金額", 80);
this.gridViewRequisition.CreateColumn("庫存數量", "庫存數量", 80);
this.gridViewRequisition.CreateColumn("可用庫存", "可用庫存", 80);

當然,如果我們想獲得對應列的一些特殊的處理,那麼可以把獲得的列對象,賦值給變量,然後進行相關的屬性處理。

var colQuantity = grv.CreateColumn("Quantity", "銷售數量");
colQuantity.AppearanceCell.BackColor = Color.Moccasin;
colQuantity.AppearanceCell.Options.UseBackColor = true;
colQuantity.CreateSpinEdit();

而對於一些特殊的列,如一些下拉列表的列,我們可以指定他們的下拉列表,可以是固定列表,也可以通過函數獲取數據庫的記錄進行綁定處理,如下所示。

var purchaseType = this.gridViewRequisition.CreateColumn("採購類型", "採購類型", 80).CreateGridLookUpEdit();
var typeList = new List<CListItem>()
{
new CListItem("正品"),
new CListItem("樣品"),
new CListItem("免費")
};
purchaseType.BindDictItems(typeList, false);

而如果備註處理,嫌GridView裏面輸入太麻煩,可以使用彈出的對話框進行處理,如下代碼所示。

var note = this.gridViewRequisition.CreateColumn("備註", "備註", 100).CreateButtonEdit();
note.EditValueChanging += (ss, ee) =>
{
gridViewRequisition.SetFocusedRowCellValue("備註", ee.NewValue);
};
note.ButtonClick += (ss, ee) =>
{
var dlg = new FrmShowTextEdit();
dlg.FieldDefaultValue = gridViewRequisition.GetFocusedRowCellDisplayText("備註");
dlg.FieldDisplayName = "備註";
if (dlg.ShowDialog() == DialogResult.OK)
{
gridViewRequisition.SetFocusedRowCellValue("備註", dlg.ReturnValue);
}
};
【DevExpress中文教程】在GridView中動態創建列時如何綁定不同編輯處理控件

彈出界面如下所示。

【DevExpress中文教程】在GridView中動態創建列時如何綁定不同編輯處理控件

或者有時候,我們使用一些其他的選擇對話框,也是類似的處理方式。

gridview.Columns.ColumnByFieldName("Creator").CreateButtonEdit().ButtonClick += (object sender, ButtonPressedEventArgs e) =>
{
FrmSelectCustomer dlg = new FrmSelectCustomer();
if(dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
if(gridview.GetFocusedRow() == null)
{
gridview.AddNewRow();//如果首次則增加一行
}
gridview.SetFocusedRowCellValue("Creator", dlg.CustomerName);
}
};

如一些列表,也可以使用LookupEdit的編輯控件進行處理選擇的展示。

【DevExpress中文教程】在GridView中動態創建列時如何綁定不同編輯處理控件

如果我們希望對列表的特定字段進行啓用編輯,那麼可以利用下面擴展函數方式實現。

//設置只讀、可編輯字段
this.gridViewAmount.SetColumnsReadOnly("*", false);
this.gridViewAmount.SetColumnsReadOnly("序列,採購類型,需求量,備註", true);

如果需要指定特定的彙總字段,可以通過下面代碼實現。

// 設置統計字段
if (gridViewAmount?.Columns.Count > 0)
{
gridViewAmount.ClearSummaryColumns();
gridViewAmount.SetSummaryColumn("採購數量", DevExpress.Data.SummaryItemType.Sum);
}

2. 列內容的格式處理

在上面動態創建的列編輯控件,對於編輯的值發生變化,需要及時的反映到實際的列表對應的單元格的值中,一般在事件EditValueChanging 中通過SetFocusedRowCellValue 就可以設置回去了,如下代碼所示。

var note = this.gridViewRequisition.CreateColumn("備註", "備註", 100).CreateButtonEdit();
note.EditValueChanging += (ss, ee) =>
{
gridViewRequisition.SetFocusedRowCellValue("備註", ee.NewValue);
};

而對於一些數值型的內容處理,如SpinEdit的編輯器控件,那麼每次輸入一個不同的字符都會觸發這個處理,那麼就有點不正常的了,因此可以通過下面的方式進行矯正,利用EditValueChanged事件的處理。

var xuqiuLiang = this.gridViewRequisition.CreateColumn("需求數量", "需求數量", 80).CreateSpinEdit();
xuqiuLiang.ValidateOnEnterKey = true;
xuqiuLiang.EditValueChanged += async (ss, ee) =>
{
var value = ((ss) as SpinEdit).Value;
this.gridViewRequisition.SetFocusedRowCellValue("需求數量", value); //刷新顯示
gridViewRequisition.RefreshRow(gridViewRequisition.FocusedRowHandle);
};

上面的代碼,通過把對應的當前控件轉換爲編輯器控件,獲得值再行處理也是可以的。

另外,有時候,如果列的內容變更了,我們需要及時刷新指定列表行的內容,可以通過下面的代碼實現的。

gridViewRequisition.RefreshRow(gridViewRequisition.FocusedRowHandle);

對於一些列表,需要給它指定刪除的操作,方便移除整條記錄,那麼爲它添加刪除鍵即可,如下代碼所示。

//行刪除操作
this.gridViewRequisition.OptionsBehavior.AllowDeleteRows = DefaultBoolean.True;
this.gridViewRequisition.KeyDown += (s, ee) =>
{
if (ee.KeyCode == Keys.Delete)
{//移除記錄
gridViewRequisition.DeleteRow(gridViewRequisition.FocusedRowHandle);
gridViewRequisition.RefreshData();

ee.Handled = true;
}
};

而對於列的一些格式轉義操作,我們可以統一處理,可以把幾個不同的GridView的轉義函數放在一起。

//統一處理轉義信息
this.gridViewRequisition.CustomColumnDisplayText += CustomColumnDisplayText;
this.gridViewSubx.CustomColumnDisplayText += CustomColumnDisplayText;
this.gridViewSpecification.CustomColumnDisplayText += CustomColumnDisplayText;

轉義一般對日期的格式和數值型的格式進行一些格式化處理,如下代碼所示。

private void CustomColumnDisplayText(object sender, CustomColumnDisplayTextEventArgs e)
{
string columnName = e.Column.FieldName;
if (e.Column.ColumnType == typeof(DateTime) || e.Column.ColumnType == typeof(DateTime?))
{
if (e.Value != null)
{
if (e.Value == DBNull.Value || Convert.ToDateTime(e.Value) <= Convert.ToDateTime("1900-1-1"))
{
e.DisplayText = "";
}
else
{
e.DisplayText = Convert.ToDateTime(e.Value).ToString("yyyy-MM-dd HH:mm");//yyyy-MM-dd
}
}
}
else if (e.Column.ColumnType == typeof(decimal) || e.Column.ColumnType == typeof(decimal?))
{
decimal value;
if (decimal.TryParse(e.DisplayText, out value))
{
e.DisplayText = value.ToString("0.################");
}
}
}

而如果喜歡對列的背景色等進行自定義,可以在事件RowCellStyle中,根據不同的字段名稱進行處理。

this.gridViewSpecification.RowCellStyle += (s, e) =>
{
e.Appearance.BackColor = Color.Transparent;
if (e.Column.FieldName == "序列")
{
var xulie = string.Concat(gridViewSubx.GetFocusedRowCellValue("序列"));
if (!xulie.IsNullOrEmpty() && e.CellValue?.ToString() == xulie)
{
e.Appearance.BackColor = Color.Red; //醒目顏色
}
}
};

有時候,我們需要反色當前選擇的單元格,那麼可以通過事件CustomDrawCell 進行控制,如下代碼所示。

this.gridView1.CustomDrawCell += (s, e) =>
{
// 設置選中單元格的背景顏色
if (e.Column == gridView1.FocusedColumn && e.RowHandle == gridView1.FocusedRowHandle)
{
e.Appearance.BackColor = Color.LightGreen;
}
};

以上就是一些利用GridView進行處理的一些經驗代碼總結,希望對您有所啓發。

本文轉載自:博客園 - 伍華聰


更多DevExpress線上公開課、中文教程資訊請上中文網獲取

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章