关于DataGridView中如何接收处于编辑状态下的当前信息
新客网 XKER.COM 2007-01-16 来源: 收藏本文 --------------------------------------------------------------------------------
前几天在尝试使用2005新出的DataGridView 控件,结果在接收当前编辑状态下的文本信息的时候出现了麻烦。比方我现在处在第一行第一列,然后我输入一个1,那这个1是什么时候才会邦定到空间的value属性里面呢,你可以通过两个途径,一个是cellendedit一个是valuechanged事件中取到,但是,还有一个麻烦,这两个事件都是在焦点移到别的cell里面去的时候才会触发或者前者在EndEdit函数执行后触发,但是什么地方去写这个函数,能不能达到预期效果呢?我做了个尝试,我曾经尝试在processcmdkey里面写这个函数触发CellEndEdit事件,但是百试不得其果,如果哪位朋友看到这里并且已经实现了的话,那么希望能够给我下个例子演示下,所以无奈下,我只能考虑用自定义的DataGridViewColumn来实现。接下来我的思路很明确,就是采用DataGridViewColumn来实现,首先,最简单的就是,我们继承一个DataGridViewTextBoxCell,和一个DataGridViewColumn控件,我们知道我们可以在文本的KeyUp事件里面取得当前文本框里面的值,在KeyPress事件里面取不倒,比方你原先有个1然后你输入一个字符a那么,keypress事件里面只有一个1只有在KeyUp事件里面才可以取得1a,当然TextChanged等其他事件里面也可以取到,我这里采用KeyUp事件,那么我们就也为DataGridViewColumn开放这个事件,所以我们再DataGridViewColumn中自定义一个事件,比方DataGridViewColumnKeyUp,然后在这个里面写个函数,函数做的工作就是判断外面有没有实现这个事件,如果实现的话旧触发该事件。然而我们这个事件是需要在文本矿的KeyUp事件中触发,所以我们还得重新写DataGridViewTextBoxCell中的InitializeEditingControl,函数,在这个函数里面实现KeyUp事件的触发,但我们还需要让外面的用户能访问到现在的值比方上面的1a,所以我们还需要为自定义的DataGridViewColumn定义这么个属性,然后在自定义的DataGridViewTextBoxCell中对其赋值,具体代码如下://MyDataGridViewColumn.cs
public class MyDataGridViewColumn : DataGridViewColumn
{
public MyDataGridViewColumn()
: base()
{
this.CellTemplate = new MyDataGridViewCell();
} public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value != null && !value.GetType().IsAssignableFrom(typeof(MyDataGridViewCell)))
{
throw new Exception("这个列里面必须邦定MyDataGridViewCell");
}
base.CellTemplate = value;
}
} private string m_dataGridViewColumnTextValue = "";
public string DataGridViewColumnTextValue
{
get
{
return m_dataGridViewColumnTextValue;
}
set
{
m_dataGridViewColumnTextValue = value;
}
} public void MyDataGridViewColumn_DataGridViewColumnKeyUp(object sender, KeyEventArgs e)
{
if (DataGridViewColumnKeyUp != null)
{
DataGridViewColumnKeyUp(this, e);
}
} public event KeyEventHandler DataGridViewColumnKeyUp;
} //MyDataGridViewCell.cs
public class MyDataGridViewCell : DataGridViewTextBoxCell
{
public MyDataGridViewCell()
: base()
{ } private DataGridViewTextBoxEditingControl dgvtbec;
private DataGridViewColumn dgvc;
private MyDataGridViewColumn mdgvc; public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{ base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
dgvtbec = DataGridView.EditingControl as DataGridViewTextBoxEditingControl;
dgvc = this.OwningColumn;
if (dgvc is MyDataGridViewColumn)
{
mdgvc = dgvc as MyDataGridViewColumn;
dgvtbec.KeyUp += new KeyEventHandler(dgvtbec_KeyUp);
}
} void dgvtbec_KeyUp(object sender, KeyEventArgs e)
{
mdgvc.DataGridViewColumnTextValue = dgvtbec.Text;
mdgvc.MyDataGridViewColumn_DataGridViewColumnKeyUp(sender, e);
}
}这样你外面就可以使用这个MyDataGridViewColumn,然后为其定义实现这个DataGridViewColumnKeyUp事件,得到这个值了。具体你大家可以做下尝试,同时我希望大家能提供一种更加好的办法,因为我这样做的话,有可能所有已经有的DataGridColumn都得重新做过了,我觉得他们微软的开发人员肯定有什么更加好的办法的,只是我不知道,希望大家能给我指条明路,谢谢!!
新客网 XKER.COM 2007-01-16 来源: 收藏本文 --------------------------------------------------------------------------------
前几天在尝试使用2005新出的DataGridView 控件,结果在接收当前编辑状态下的文本信息的时候出现了麻烦。比方我现在处在第一行第一列,然后我输入一个1,那这个1是什么时候才会邦定到空间的value属性里面呢,你可以通过两个途径,一个是cellendedit一个是valuechanged事件中取到,但是,还有一个麻烦,这两个事件都是在焦点移到别的cell里面去的时候才会触发或者前者在EndEdit函数执行后触发,但是什么地方去写这个函数,能不能达到预期效果呢?我做了个尝试,我曾经尝试在processcmdkey里面写这个函数触发CellEndEdit事件,但是百试不得其果,如果哪位朋友看到这里并且已经实现了的话,那么希望能够给我下个例子演示下,所以无奈下,我只能考虑用自定义的DataGridViewColumn来实现。接下来我的思路很明确,就是采用DataGridViewColumn来实现,首先,最简单的就是,我们继承一个DataGridViewTextBoxCell,和一个DataGridViewColumn控件,我们知道我们可以在文本的KeyUp事件里面取得当前文本框里面的值,在KeyPress事件里面取不倒,比方你原先有个1然后你输入一个字符a那么,keypress事件里面只有一个1只有在KeyUp事件里面才可以取得1a,当然TextChanged等其他事件里面也可以取到,我这里采用KeyUp事件,那么我们就也为DataGridViewColumn开放这个事件,所以我们再DataGridViewColumn中自定义一个事件,比方DataGridViewColumnKeyUp,然后在这个里面写个函数,函数做的工作就是判断外面有没有实现这个事件,如果实现的话旧触发该事件。然而我们这个事件是需要在文本矿的KeyUp事件中触发,所以我们还得重新写DataGridViewTextBoxCell中的InitializeEditingControl,函数,在这个函数里面实现KeyUp事件的触发,但我们还需要让外面的用户能访问到现在的值比方上面的1a,所以我们还需要为自定义的DataGridViewColumn定义这么个属性,然后在自定义的DataGridViewTextBoxCell中对其赋值,具体代码如下://MyDataGridViewColumn.cs
public class MyDataGridViewColumn : DataGridViewColumn
{
public MyDataGridViewColumn()
: base()
{
this.CellTemplate = new MyDataGridViewCell();
} public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value != null && !value.GetType().IsAssignableFrom(typeof(MyDataGridViewCell)))
{
throw new Exception("这个列里面必须邦定MyDataGridViewCell");
}
base.CellTemplate = value;
}
} private string m_dataGridViewColumnTextValue = "";
public string DataGridViewColumnTextValue
{
get
{
return m_dataGridViewColumnTextValue;
}
set
{
m_dataGridViewColumnTextValue = value;
}
} public void MyDataGridViewColumn_DataGridViewColumnKeyUp(object sender, KeyEventArgs e)
{
if (DataGridViewColumnKeyUp != null)
{
DataGridViewColumnKeyUp(this, e);
}
} public event KeyEventHandler DataGridViewColumnKeyUp;
} //MyDataGridViewCell.cs
public class MyDataGridViewCell : DataGridViewTextBoxCell
{
public MyDataGridViewCell()
: base()
{ } private DataGridViewTextBoxEditingControl dgvtbec;
private DataGridViewColumn dgvc;
private MyDataGridViewColumn mdgvc; public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{ base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
dgvtbec = DataGridView.EditingControl as DataGridViewTextBoxEditingControl;
dgvc = this.OwningColumn;
if (dgvc is MyDataGridViewColumn)
{
mdgvc = dgvc as MyDataGridViewColumn;
dgvtbec.KeyUp += new KeyEventHandler(dgvtbec_KeyUp);
}
} void dgvtbec_KeyUp(object sender, KeyEventArgs e)
{
mdgvc.DataGridViewColumnTextValue = dgvtbec.Text;
mdgvc.MyDataGridViewColumn_DataGridViewColumnKeyUp(sender, e);
}
}这样你外面就可以使用这个MyDataGridViewColumn,然后为其定义实现这个DataGridViewColumnKeyUp事件,得到这个值了。具体你大家可以做下尝试,同时我希望大家能提供一种更加好的办法,因为我这样做的话,有可能所有已经有的DataGridColumn都得重新做过了,我觉得他们微软的开发人员肯定有什么更加好的办法的,只是我不知道,希望大家能给我指条明路,谢谢!!
DataGridView是.net2.0的一个新增数据控件,功能比DataGrid增强了很多,但是并没有CellKeyPress事件来限制文本列的输入。我利用一个新增的事件EditConTrolShowing解决这个问题。
Private EditingControl As DataGridViewTextBoxEditingControl
Private Sub datagridview1_EditingControlShowing()Sub datagridview1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles datagridview1.EditingControlShowing
EditingControl = CType(e.Control, DataGridViewTextBoxEditingControl)
AddHandler EditingControl.KeyPress, AddressOf editingcontrol_Keypress
End Sub
Public Sub editingcontrol_Keypress()Sub editingcontrol_Keypress(ByVal sender As System.Object, ByVal e As KeyPressEventArgs)
‘写上处理语句
End Sub
Private Sub datagridview1_CellEndEdit()Sub datagridview1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles datagridview1.CellEndEdit
RemoveHandler EditingControl.KeyPress, AddressOf editingcontrol_Keypress
End Sub
这样就可以解决限制输入的问题,以此类推,很多其他问题都可以通过这个方式解决。