"I am using datagrid to display records from access db. I got the first field as ID which is primary key. As users should not edit it i made that column as read only but i need that column to be editable when users tries to add a new record(row). I am using windows forms (vb.net)"
Now I tried to solve this problem and this is what I've got:
| // Step 1 | 
| DataGridTableStyle tableStyle = new DataGridTableStyle(); | 
| tableStyle.MappingName = "Products"; | 
| DataColumnCollection myDataColumns = ds.Tables["Products"].Columns; | 
| // Step 2 | 
| DataGridTextBoxColumn dgTbCol; | 
| foreach (DataColumn dataColumn in myDataColumns) | 
| { | 
| dgTbCol = new DataGridTextBoxColumn(); | 
| dgTbCol.MappingName = dataColumn.ColumnName; | 
| dgTbCol.ReadOnly = true; | 
| tableStyle.GridColumnStyles.Add(dgTbCol); | 
| } | 
| dataGrid1.TableStyles.Add(tableStyle); | 
| // Step 3 | 
| ds.Tables["Products"].TableNewRow += new DataTableNewRowEventHandler(Form1_TableNewRow); | 
| ds.Tables["Products"].RowChanged += new DataRowChangeEventHandler(Form1_RowChanged); | 
| dataGrid1.CurrentCellChanged +=new EventHandler(dataGrid1_CurrentCellChanged); | 
| private void Form1_TableNewRow(Object sender, DataTableNewRowEventArgs e) | 
| { | 
| currentRow = (sender as DataTable).Rows.Count; | 
| GridColumnStylesCollection gcsc = dataGrid1.TableStyles["Products"].GridColumnStyles; | 
| DataRowCollection drc; | 
| foreach (DataGridTextBoxColumn dgTbCol in gcsc) | 
| { | 
| if (dataGrid1.CurrentCell.RowNumber == currentRow) | 
| { | 
| Console.WriteLine(dataGrid1.CurrentCell.RowNumber) ; | 
| dgTbCol.ReadOnly = false; | 
| } | 
| } | 
| } | 
| private void Form1_RowChanged(Object sender, DataRowChangeEventArgs e) | 
| { | 
| GridColumnStylesCollection gcsc = dataGrid1.TableStyles["Products"].GridColumnStyles; | 
| foreach (DataGridTextBoxColumn dgTbCol in gcsc) | 
| { | 
| dgTbCol.ReadOnly = true; | 
| } | 
| } | 
| private void dataGrid1_CurrentCellChanged(Object sender, EventArgs e) | 
| { | 
| GridColumnStylesCollection gcsc = dataGrid1.TableStyles["Products"].GridColumnStyles; | 
| foreach (DataGridTextBoxColumn dgTbCol in gcsc) | 
| { | 
| // currentRow should be a global variable | 
| if (dataGrid1.CurrentCell.RowNumber != currentRow) | 
| { | 
| Console.WriteLine(dataGrid1.CurrentCell.RowNumber) ; | 
| dgTbCol.ReadOnly = true; | 
| } | 
| } | 
| } | 
Now I'm sure this isn't the best way to do and I have One REMARK: i've made all columns readonly and then is added a new row all are editable in new row. U can make minor changes to accomodate it to ur requirements.
U should pay attention to events TableNewRow, RowChanged, and CurrentCellChanged, if u have questions ask.
 
No comments:
Post a Comment