Saturday, April 5, 2008

Enable read only column as editable when it is a new row

Yesterday I saw a post at bytes.com .NET forum a question that sounded like this

"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: