PDA

View Full Version : Tản mạn về DataGrid trong dotNet.



quangvu
10-11-2002, 14:42
Nếu ai đó đã từng lập trình CDSL trong VBasic 6.0 thì hẳn sẽ biết tầm quan trọng của các DataGrid.Nó quang trọng đến độ nếu có một Grid thích hợp bạn có thể giảm 20% chi phí thiết kế chương trình (kinh nhiệm bản thân).
Một số ứng dụng như "Quản lý khách sạn X" ,"Quản lý bán lẽ cho cửa hàng Y" các Grid còn phải làm những việc cao cập như trình bài các Button ,Check . . . và cả đồ thị nữa !
*** Có một đều là đa số các Grid đó đều khó tìm và ở dạng "Dùng thử"
***Với dotNet thì các bạn có thể yên tâm ,Grid của dotNet làm được tất .Nó có thể móc nối CSDL ,nhúng các phần tử khác vào Grid ,đưa Grid lên Web . . . nói chung là tuyệt vời .Mà sử dụng lại rất đơn giản.

pioneer
13-11-2002, 15:20
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace UI
{
/// <summary>
/// Summary description for DataDefinitionControl.
/// </summary>

public class DataDefinitionControl : System.Windows.Forms.UserControl
{
#region Member Variables

private System.Windows.Forms.GroupBox myDataDefinitionsGroupBox;
private System.Windows.Forms.Button myBtnFindItem;
private System.Windows.Forms.Button myBtnSaveChanges;
internal UI.MyDataGrid myDataGrid;
private System.ComponentModel.IContainer components;
private DataGridComboBoxColumn myTypeCombobox;
private DataDefinitionService mDataDefService;
private System.Windows.Forms.ImageList myImageLst;
private System.Windows.Forms.ContextMenu myContextMenu;
private System.Windows.Forms.MenuItem mnuAdd;
private System.Windows.Forms.MenuItem mnuDelete;
private System.Windows.Forms.Button btnAdd;
private System.Windows.Forms.Button btnDelete;
private DataDefinitionDataSet myDataSet;

#endregion

public DataDefinitionControl(DataDefinitionService dataDefService)
{
mDataDefService = dataDefService;

InitializeComponent();
ChangeButtonState(false);
try
{
UpdateDataSet();
CreateDataTableStyle();
UpdateDataGrid();

mDataDefService.DataDefinitionModified
+= new System.EventHandler(MyDataDefinitionModifiedEventH andler);

//this.HandleDestroyed += new System.EventHandler(MyApplicationExitHandler);
Application.ApplicationExit += new System.EventHandler(MyApplicationExitHandler);
}
catch(DataException dx)
{
myDataSet = null;
MessageBox.Show(
dx.Message + "\r\nError code: " + dx.ErrorCode,
"Data Management", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}

private void MyDataDefinitionModifiedInvoke(object sender, System.EventArgs e)
{
UpdateDataSet();
UpdateDataGrid();
}

private void MyDataDefinitionModifiedEventHandler(object sender, System.EventArgs e)
{
//kht commented out for now - does not work with MarbleFrame
// if(myDataGrid.IsDisposed == false) //skip if oject has been disposed
// {
// //This handler can be called by any thread so we need to use Control.BeginInvoke to pass
// //it to UI thread so control can be update properly
// myDataGrid.BeginInvoke(new System.EventHandler(MyDataDefinitionModifiedInvoke ),
// new object[] {sender, e});
// }

UpdateDataSet();
UpdateDataGrid();
}

private void MyApplicationExitHandler(object sender, EventArgs args)
{
if(IsModified)
{
if(MessageBox.Show("Save changes to Data Definition?",
"Data Definition",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes)
{
SaveData();
}
}
Application.Exit();
}

private void UpdateDataSet()
{
myDataSet = mDataDefService.DataDefinitionDataSet;
ChangeButtonState(true);
}

private void CreateDataTableStyle()
{
DataGridTableStyle dtStyle = new DataGridTableStyle();
dtStyle.MappingName = myDataSet.Tables[0].TableName;

dtStyle.AlternatingBackColor = Color.FromArgb(213,240,249);

DataGridTextBoxColumn TextCol;

TextCol = new DataGridTextBoxColumn();
TextCol.MappingName =
myDataSet.Tables[0].Columns[DataDefinitionDataSet.DESCRIPTION].ColumnName;
TextCol.HeaderText = "Description";
TextCol.NullText = "";
TextCol.Width = 200;
dtStyle.GridColumnStyles.Add(TextCol);

ArrayList lstTypes = new ArrayList();
foreach(string sType in Enum.GetNames(typeof(DataDefinition.DATA_TYPE)))
{
lstTypes.Add(sType);
}

myTypeCombobox = new DataGridComboBoxColumn();
myTypeCombobox.ColumnComboBox.DataSource = lstTypes;
myTypeCombobox.MappingName =
myDataSet.Tables[0].Columns[DataDefinitionDataSet.DATA_TYPE].ColumnName;
myTypeCombobox.HeaderText = "DataType";
myTypeCombobox.Width = 122;
dtStyle.GridColumnStyles.Add(myTypeCombobox);
dtStyle.PreferredRowHeight = myTypeCombobox.ColumnComboBox.Height + 2;
myTypeCombobox.ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
myTypeCombobox.NullText = "";

DataGridBoolColumn BoolCol = new DataGridBoolColumn();
BoolCol.AllowNull = false;
BoolCol.Width = 40;
BoolCol.MappingName =
myDataSet.Tables[0].Columns[DataDefinitionDataSet.OPTION].ColumnName;
BoolCol.HeaderText = "Log";
dtStyle.GridColumnStyles.Add(BoolCol);
dtStyle.AllowSorting = false;

myDataGrid.TableStyles.Add(dtStyle);
}

private void UpdateDataGrid()
{
myDataGrid.SetDataBinding(myDataSet, myDataSet.DataSetName);
myDataGrid.Refresh();
}

public void SaveData()
{
try
{
if(IsModified)
{
mDataDefService.CommitDataSet();
}

}
catch(Exception ex)
{
MessageBox.Show(ex.Message,
"Database Update Error",
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}
}

public bool IsModified
{
get
{
return myDataSet.HasChanges();
}
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(DataDefini tionControl));
this.myImageLst = new System.Windows.Forms.ImageList(this.components);
this.myDataDefinitionsGroupBox = new System.Windows.Forms.GroupBox();
this.btnDelete = new System.Windows.Forms.Button();
this.btnAdd = new System.Windows.Forms.Button();
this.myDataGrid = new UI.MyDataGrid(this.components);
this.myContextMenu = new System.Windows.Forms.ContextMenu();
this.mnuAdd = new System.Windows.Forms.MenuItem();
this.mnuDelete = new System.Windows.Forms.MenuItem();
this.myBtnSaveChanges = new System.Windows.Forms.Button();
this.myBtnFindItem = new System.Windows.Forms.Button();
this.myDataDefinitionsGroupBox.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.m yDataGrid)).BeginInit();
this.SuspendLayout();
//
// myImageLst
//
this.myImageLst.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
this.myImageLst.ImageSize = new System.Drawing.Size(26, 26);
this.myImageLst.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resource s.GetObject("myImageLst.ImageStream")));
this.myImageLst.TransparentColor = System.Drawing.Color.Transparent;
//
// myDataDefinitionsGroupBox
//
this.myDataDefinitionsGroupBox.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right);
this.myDataDefinitionsGroupBox.Controls.AddRange(n ew System.Windows.Forms.Control[] {
this.btnDelete,
this.btnAdd,
this.myDataGrid,
this.myBtnSaveChanges,
this.myBtnFindItem});
this.myDataDefinitionsGroupBox.Location = new System.Drawing.Point(4, 8);
this.myDataDefinitionsGroupBox.Name = "myDataDefinitionsGroupBox";
this.myDataDefinitionsGroupBox.Size = new System.Drawing.Size(480, 480);
this.myDataDefinitionsGroupBox.TabIndex = 8;
this.myDataDefinitionsGroupBox.TabStop = false;
this.myDataDefinitionsGroupBox.Text = "Data Definitions";
//
// btnDelete
//
this.btnDelete.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left);
this.btnDelete.Image = ((System.Drawing.Bitmap)(resources.GetObject("btnDelete.Image")));
this.btnDelete.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
//this.btnDelete.ImageIndex = 3;
this.btnDelete.ImageList = this.myImageLst;
this.btnDelete.Location = new System.Drawing.Point(90, 440);
this.btnDelete.Name = "btnDelete";
this.btnDelete.Size = new System.Drawing.Size(75, 31);
this.btnDelete.TabIndex = 11;
this.btnDelete.Text = "Delete";
this.btnDelete.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.btnDelete.Click += new System.EventHandler(this.btnDelete_Click);
//
// btnAdd
//
this.btnAdd.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left);
this.btnAdd.Image = ((System.Drawing.Bitmap)(resources.GetObject("btnAdd.Image")));
this.btnAdd.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
//this.btnAdd.ImageIndex = 2;
this.btnAdd.ImageList = this.myImageLst;
this.btnAdd.Location = new System.Drawing.Point(8, 440);
this.btnAdd.Name = "btnAdd";
this.btnAdd.Size = new System.Drawing.Size(75, 31);
this.btnAdd.TabIndex = 10;
this.btnAdd.Text = "Add";
this.btnAdd.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
//
// myDataGrid
//
this.myDataGrid.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right);
this.myDataGrid.CaptionVisible = false;
this.myDataGrid.ContextMenu = this.myContextMenu;
this.myDataGrid.DataMember = "";
this.myDataGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.myDataGrid.Location = new System.Drawing.Point(8, 20);
this.myDataGrid.Name = "myDataGrid";
this.myDataGrid.Size = new System.Drawing.Size(464, 412);
this.myDataGrid.TabIndex = 9;
//
// myContextMenu
//
this.myContextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.mnuAdd,
this.mnuDelete});
//
// mnuAdd
//
this.mnuAdd.Index = 0;
this.mnuAdd.Text = "Add";
this.mnuAdd.Click += new System.EventHandler(this.mnuAdd_Click);
//
// mnuDelete
//
this.mnuDelete.Index = 1;
this.mnuDelete.Text = "Delete";
this.mnuDelete.Click += new System.EventHandler(this.mnuDelete_Click);
//
// myBtnSaveChanges
//
this.myBtnSaveChanges.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);
this.myBtnSaveChanges.Image = ((System.Drawing.Bitmap)(resources.GetObject("myBtnSaveChanges.Image")));
this.myBtnSaveChanges.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
//this.myBtnSaveChanges.ImageIndex = 1;
this.myBtnSaveChanges.ImageList = this.myImageLst;
this.myBtnSaveChanges.Location = new System.Drawing.Point(360, 440);
this.myBtnSaveChanges.Name = "myBtnSaveChanges";
this.myBtnSaveChanges.Size = new System.Drawing.Size(112, 31);
this.myBtnSaveChanges.TabIndex = 8;
this.myBtnSaveChanges.Text = "Save Changes";
this.myBtnSaveChanges.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.myBtnSaveChanges.Click += new System.EventHandler(this.myBtnSaveChanges_Click);
//
// myBtnFindItem
//
this.myBtnFindItem.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left);
this.myBtnFindItem.Image = ((System.Drawing.Bitmap)(resources.GetObject("myBtnFindItem.Image")));
this.myBtnFindItem.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
//this.myBtnFindItem.ImageIndex = 0;
this.myBtnFindItem.ImageList = this.myImageLst;
this.myBtnFindItem.Location = new System.Drawing.Point(172, 440);
this.myBtnFindItem.Name = "myBtnFindItem";
this.myBtnFindItem.Size = new System.Drawing.Size(96, 31);
this.myBtnFindItem.TabIndex = 7;
this.myBtnFindItem.Text = "Find Item...";
this.myBtnFindItem.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.myBtnFindItem.Click += new System.EventHandler(this.myBtnFindItem_Click);
//
// DataDefinitionControl
//
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.myDataDefinitionsGroupBox});
this.Name = "DataDefinitionControl";
this.Size = new System.Drawing.Size(488, 504);
this.Load += new System.EventHandler(this.DataDefinitionControl_Loa d);
this.myDataDefinitionsGroupBox.ResumeLayout(false) ;
((System.ComponentModel.ISupportInitialize)(this.m yDataGrid)).EndInit();
this.ResumeLayout(false);

}
#endregion

private void myBtnSaveChanges_Click(object sender, System.EventArgs e)
{
SaveData();
}

private void myBtnFindItem_Click(object sender, System.EventArgs e)
{
if(myDataGrid.VisibleRowCount > 1)
myDataGrid.UnSelect(myDataGrid.CurrentRowIndex);
SearchDlg searchDlg = new SearchDlg(this, myDataSet);
searchDlg.ShowDialog();
}

private void ChangeButtonState(bool state)
{
myBtnFindItem.Enabled = state;
myBtnSaveChanges.Enabled = state;
}

private void DataDefinitionControl_Load(object sender, System.EventArgs e)
{
myDataGrid.Update();
myDataGrid.Refresh();
}

private void mnuAdd_Click(object sender, System.EventArgs e)
{
AddDataDefinitionItem();
}

private void mnuDelete_Click(object sender, System.EventArgs e)
{
DeleteDataDefinitionItem();
}

private void btnAdd_Click(object sender, System.EventArgs e)
{
AddDataDefinitionItem();
}

private void btnDelete_Click(object sender, System.EventArgs e)
{
DeleteDataDefinitionItem();
}

#region "Process for deleting and adding"

private void DeleteDataDefinitionItem()
{
ArrayList lstIDs = new ArrayList();
BindingManagerBase bmbDatafinition = myDataGrid.BindingContext[myDataGrid.DataSource,myDataGrid.DataMember];

for(int i = bmbDatafinition.Count-1;i >=0; i-- )
{
if(myDataGrid.IsSelected(i))
lstIDs.Add(i);
}

if(lstIDs.Count <= 0)
{
MessageBox.Show("No row selected!","Data Management",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
return;
}

if(MessageBox.Show("Do you really want to delete ?",
"Data Management",MessageBoxButtons.YesNo,
MessageBoxIcon.Question,System.Windows.Forms.Messa geBoxDefaultButton.Button2)== DialogResult.Yes)
foreach(int objId in lstIDs)
{
bmbDatafinition.RemoveAt(objId);
}
else
foreach(int objId in lstIDs)
{
myDataGrid.UnSelect(objId);
}

myDataGrid.Refresh();
}

private void AddDataDefinitionItem()
{
try
{
myDataGrid.BindingContext[myDataGrid.DataSource,myDataGrid.DataMember].AddNew();

}
catch
{
MessageBox.Show("The new row doesn't allow nulls","Data Management",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
}
myDataGrid.Refresh();
}

#endregion
}
}

danceswithwolves
13-11-2002, 19:37
hic cái gì đây trời ? pioneer@ ơi, bạn có nghĩ ra ai đủ can đảm ngồi đọc code của bạn không đó ?

Các bạn nào muốn nghiên cứu về ADO .NET (including DataGrid web/form control) thì nên đọc Professional ADO .NET của Wrox. Bản ebook thì admin@ nhà ta có sẵn, đến... xin là được. Hehehe.

Allbegins
11-12-2002, 21:35
quang vũ tiếp tục tản mạn .... để bà con biết và xài cái DataGrid đi.

quangvhg
24-12-2002, 13:04
Bạn nói đúng! Datagrid của .Net hơn hẳn các phiên bản trước. Chỉ cần chúng ta chịu khó tìm hiểu thì sẽ làm được hầu hết các việc mà truớc đây phải dùng các Grid thương mại (Vd: TrueDBGrid hay FlexGrid) mới có được. Tôi sẽ xin góp một vài thủ thuật khi dùng DataGrid .Net để có được một giao diện hoàn chỉnh và các combobox giống như trên Access.

edwin
09-01-2003, 10:52
Bạn ơi.
Ai mà sử dụng DataGrid trong .NET. Vừa nghèo vừa ít tính năng vừa khó sử dụng.

Nếu bạn muốn xây dựng các ctrình có mức chuyên nghiệp cao, nên dùng các DataGrid của các thirtparty như Janus, ComponentOne, NetAdvantage.

lazy-programmer
10-01-2003, 09:18
Các ActiveX hoạt động không xuôn sẻ lắm trong môi trường .Net. Hơn nữa một số không hỗ trợ Unicode. Mình đang viết vài bài về s/d Datagrid.Net. Mong bạn góp ý. Thanks

danceswithwolves
10-01-2003, 10:49
hoan nghênh ý định của lazy-programmer@. Cũng xin mạn đàm một chút về DataGrid : có một lỗi to đùng ngã ngửa nằm trong control này, đã được Jeffrey Richter phát hiện và công bố trong quyển Applied Microsoft .NET Framework Programming. Tớ đã thử nghiệm lại và thấy... đúng :D (.NET Framework 1.0, không biết bản 1.1 thì sao).

Dù sao đi nữa, DataGrid đã là bước nhảy vọt so với họ grid truyền thống của M$.

greenhill
03-04-2003, 13:19
đồng y' với edwin
tui đang xài Janus control đây !
mấy cái datagrid của DOTNET trên web form th`i tuyệt thật chứ trong window thi` xấu không chịu nổi, mà hình như trong datagrid window form chỉ có 2 dạng edit là textbox và boolean mà thôi muốn sử dụng combo hay 1 cái nào khác thì phải đổ mồ hôi sôi nước mắt mới được........

hulyxu
05-04-2003, 10:47
Bài viết được gửi bởi danceswithwolves
hoan nghênh ý định của lazy-programmer@. Cũng xin mạn đàm một chút về DataGrid : có một lỗi to đùng ngã ngửa nằm trong control này, đã được Jeffrey Richter phát hiện và công bố trong quyển Applied Microsoft .NET Framework Programming. Tớ đã thử nghiệm lại và thấy... đúng :D (.NET Framework 1.0, không biết bản 1.1 thì sao).

Dù sao đi nữa, DataGrid đã là bước nhảy vọt so với họ grid truyền thống của M$.
Bạn có thể nói rõ hơn về lỗi này không? Rất cảm ơn.

consoilangthang
07-04-2003, 15:34
bạn xem thử cái này http://www.diendantinhoc.com/showthread.php?s=&threadid=13634

nguyen_lanthao
07-05-2003, 16:43
những datagrid chuyên nghiệp như Janus, ComponentOne, NetAdvantage mình có thể dùng nó ở đâu, xài chương trình nào. vì B chưa từng dùng nó, rất mong các bạn nói rõ hơn. Có thể dùng nó trong vb.net không? và cần các component nào?
thanks

xbacala
08-05-2003, 09:18
Janus: http://www.janusys.com/
NetAdvantage: http://www.infragistics.com/
ComponentOne: http://www.componentone.com

Có thể lên mấy cái site này download trial về dùng thử. Nếu có ***** thì có thể dùng được!

quydaica
10-05-2003, 17:42
Tôi đã thử kết nối vơi Datagrid trong ASP.NET khi kết nối vào Database của Oracle 9i nhưng nó không xuất hiện đúng ký tự Unicode , trong khi đó cũng với Connection đó tôi vào MS Excel 2002 dung Import Data thì lại lấy được đầy đủ ký tự Unicode trong DB đó. Vậy chứng tỏ VS. NET or DATAGRID NET không hổ trợ UNICODE Tiếng Việt như đã quảng cáo là bộ công cụ hỗ trợ Multi Language . Hay là tôi chưa làm đúng các thủ tục để hiện thị dúng Unicode trong DATAGRID , các bạn có thể giúp tôi được không

vanlang
12-05-2003, 14:27
mấy bác nói tiếp đi chứ

hoangminh
19-12-2003, 10:48
Tôi sử dụng Windows XP chay DataGrid hiển thị font Unicode bình thường chứ đâu có gì! (vì Windows XP hổ trợ Unicode rất tốt trong môi trường .NET) lúc lưu project bạn có chọn Unicode không?

ZHa
25-12-2003, 19:50
mình dung Datagrid = chương trình Janus nhưng ko biết cách kết nối đưa dữ liệu từ nhiều bảng vào cùng 1 grid = cách nào(mình mới tự học) bạn nào biết có thể vui lòng giúp mình, xin cảm ơn