Hi
I have a RadGrid with 3 columns.
Column 1 is a GridViewCheckBoxColumns named "ColA"
Column 2 is a GridViewTextBoxColumn named "ColB"
Column 3 is a GridViewCheckBoxColumn named "ColC"
On the third Column only, I want that only one row can be checked.
So if user click on a CheckBox in Columns 3, all others CheckBox for this column must be unchecked.
How to do this ?
Thanks
I have a RadGrid with 3 columns.
Column 1 is a GridViewCheckBoxColumns named "ColA"
Column 2 is a GridViewTextBoxColumn named "ColB"
Column 3 is a GridViewCheckBoxColumn named "ColC"
On the third Column only, I want that only one row can be checked.
So if user click on a CheckBox in Columns 3, all others CheckBox for this column must be unchecked.
How to do this ?
Thanks
9 Answers, 1 is accepted
0

Emanuel Varga
Top achievements
Rank 1
answered on 29 Apr 2011, 03:24 PM
Hello Filleau,
It's a very rough example but it should do what you want:
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Telerik WinForms MVP
It's a very rough example but it should do what you want:
using
System.Collections.Generic;
using
System.Linq;
using
System.Windows.Forms;
using
Telerik.WinControls.UI;
public
partial
class
Form1 : Form
{
private
RadGridView radGridView1;
public
Form1()
{
InitializeComponent();
this
.Controls.Add(radGridView1 =
new
RadGridView());
radGridView1.Dock = DockStyle.Fill;
radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
var persons =
new
List<Person>();
for
(
int
i = 0; i < 10; i++)
{
persons.Add(
new
Person { ID = i, Name =
"Person "
+ i, Active = i % 2 == 0, Representative =
false
});
}
radGridView1.DataSource = persons;
radGridView1.ValueChanging +=
new
ValueChangingEventHandler(radGridView1_ValueChanging);
}
void
radGridView1_ValueChanging(
object
sender, ValueChangingEventArgs e)
{
if
(radGridView1.CurrentColumn.FieldName ==
"Representative"
)
{
foreach
(var row
in
radGridView1.Rows.Where(r =>
r.DataBoundItem !=
null
&& r.Cells[
"Representative"
].Value !=
null
&& (
bool
)r.Cells[
"Representative"
].Value &&
e.NewValue !=
null
&& ((
bool
)e.NewValue) !=
false
))
{
row.Cells[
"Representative"
].Value =
false
;
}
}
}
}
public
class
Person
{
public
int
ID {
get
;
set
; }
public
string
Name {
get
;
set
; }
public
bool
Active {
get
;
set
; }
public
bool
Representative {
get
;
set
; }
}
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Telerik WinForms MVP
0

Filleau
Top achievements
Rank 1
answered on 29 Apr 2011, 03:57 PM
Thanks
But because I'm working with VB, I used the Telerik Converter to try your solution.
But I have a problem with this line
But because I'm working with VB, I used the Telerik Converter to try your solution.
But I have a problem with this line
radGridView1.ValueChanging +=
new
ValueChangingEventHandler(radGridView1_ValueChanging);
in VB : radGridView1.ValueChanging += New ValueChangingEventHandler(radGridView1_ValueChanging)
I don't know where to put it.... Everywhere VS Editor mark it as error
It's seem I don't have or don't found the Sub NEW()
0

Emanuel Varga
Top achievements
Rank 1
answered on 29 Apr 2011, 04:04 PM
Hello Fileau,
Those are the AddHandler and RemoveHandler , please change those to this:
You should put it in the constructor, or if you prefer to do this from the designer, go to the grid, events, and register for the ValueChanging event from there.
Those are the AddHandler and RemoveHandler , please change those to this:
AddHandler
radGridView1.ValueChanging,
AddressOf
radGridView1_ValueChanging
You should put it in the constructor, or if you prefer to do this from the designer, go to the grid, events, and register for the ValueChanging event from there.
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Telerik WinForms MVP
0

Filleau
Top achievements
Rank 1
answered on 29 Apr 2011, 05:04 PM
Hey thanks !
It was so simple.
I just resume in :
It was so simple.
I just resume in :
Private
Sub
RadGridView1_CellValueChanged(
ByVal
sender
As
System.
Object
,
ByVal
e
As
Telerik.WinControls.UI.GridViewCellEventArgs)
Handles
RadGridView1.CellValueChanged
If
RadGridView1.CurrentColumn.Name =
"ColC"
Then
For
Each
row
As
GridViewRowInfo
In
RadGridView1.Rows
row.Cells(
"ColC"
).Value =
False
Next
End
If
End
Sub
0

Filleau
Top achievements
Rank 1
answered on 01 May 2011, 09:19 AM
Hi
I have one more problem with my code.
On my grid everything seem to be good. I can have only one checkbox checked.
But after If I put a RadButton with a code like this :
The MsgBox is never Display.
I have on checkbox checked on the screen but the value is False !
Thanks
I have one more problem with my code.
On my grid everything seem to be good. I can have only one checkbox checked.
But after If I put a RadButton with a code like this :
For
Each
row
As
GridViewRowInfo
In
RadGridView1.Rows
If
row.Cells(
"ColC"
).Value =
True
Then
MsgBox(
"Hello World !"
)
Next
The MsgBox is never Display.
I have on checkbox checked on the screen but the value is False !
Thanks
0

Emanuel Varga
Top achievements
Rank 1
answered on 01 May 2011, 10:16 AM
Hello again,
Try it like this:
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Telerik WinForms MVP
Try it like this:
Private
Sub
button_Click(sender
As
Object
, e
As
System.EventArgs)
For
Each
row
As
var
In
Me
.radGridView1.Rows
If
row.Cells(
"Representative"
).Value IsNot
Nothing
AndAlso
CBool
(row.Cells(
"Representative"
).Value)
Then
MessageBox.Show(
"Row "
+ row.Index +
" is checked!"
)
End
If
Next
End
Sub
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Telerik WinForms MVP
0

Filleau
Top achievements
Rank 1
answered on 02 May 2011, 06:06 AM
Sorry but no success with it.
Private
Sub
RadGridView1_CellValueChanged(
ByVal
sender
As
System.
Object
,
ByVal
e
As
Telerik.WinControls.UI.GridViewCellEventArgs)
Handles
RadGridView1.CellValueChanged
If
RadGridView1.CurrentColumn.Name =
"Master"
Then
For
Each
row
As
GridViewRowInfo
In
RadGridView1.Rows
row.Cells(
"Master"
).Value =
False
Next
End
If
End
Sub
Private
Sub
RadButton8_Click(
ByVal
sender
As
System.
Object
,
ByVal
e
As
System.EventArgs)
Handles
RadButton8.Click
For
Each
row
As
GridViewRowInfo
In
RadGridView1.Rows
If
Not
row.Cells(
"Master"
).Value
Is
Nothing
AndAlso
CBool
(row.Cells(
"Master"
).Value)
Then
MessageBox.Show(
"Row "
+ row.Index +
" is checked!"
)
End
If
Next
End
Sub
0
Accepted

Emanuel Varga
Top achievements
Rank 1
answered on 02 May 2011, 06:50 AM
Hello again,
Sorry, i cannot reproduce this problem, but there is one thing that you have changed from my example: The ValueChanging event with the CellValueChanged, basically you are calcelling the selection there, because the ValueChanging event fires before the value has been changed, so I could easily change all of the row's selection state to false, but because you are using the CellValueChanged event you have to ignore the CurrentRow's state.
Hope you understood, with my suggestion here is a full example:
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Telerik WinForms MVP
Sorry, i cannot reproduce this problem, but there is one thing that you have changed from my example: The ValueChanging event with the CellValueChanged, basically you are calcelling the selection there, because the ValueChanging event fires before the value has been changed, so I could easily change all of the row's selection state to false, but because you are using the CellValueChanged event you have to ignore the CurrentRow's state.
Hope you understood, with my suggestion here is a full example:
Imports
System.Collections.Generic
Imports
System.Linq
Imports
System.Windows.Forms
Imports
Telerik.WinControls.UI
Partial
Public
Class
Form1
Inherits
Form
Private
radGridView1
As
RadGridView
Public
Sub
New
()
InitializeComponent()
Me
.Controls.Add(InlineAssignHelper(radGridView1,
New
RadGridView()))
radGridView1.Dock = DockStyle.Fill
radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill
Dim
persons =
New
List(Of Person)()
For
i
As
Integer
= 0
To
9
persons.Add(
New
Person()
With
{ _
.ID = i, _
.Name =
"Person "
+ i.ToString, _
.Active = i
Mod
2 = 0, _
.Representative =
False
_
})
Next
radGridView1.DataSource = persons
AddHandler
radGridView1.ValueChanging,
AddressOf
radGridView1_ValueChanging
Dim
button
As
New
RadButton
button.Text =
"Click me!"
AddHandler
button.Click,
AddressOf
Button_Click
button.Dock = DockStyle.Bottom
Controls.Add(button)
End
Sub
Private
Sub
radGridView1_ValueChanging(
ByVal
sender
As
Object
,
ByVal
e
As
ValueChangingEventArgs)
If
radGridView1.CurrentColumn.FieldName =
"Representative"
Then
For
Each
row
As
GridViewDataRowInfo
In
radGridView1.Rows.Where(
Function
(r) r.DataBoundItem IsNot
Nothing
AndAlso
r.Cells(
"Representative"
).Value IsNot
Nothing
AndAlso
CBool
(r.Cells(
"Representative"
).Value)
AndAlso
e.NewValue IsNot
Nothing
AndAlso
CBool
(e.NewValue) <>
False
)
row.Cells(
"Representative"
).Value =
False
Next
End
If
End
Sub
Private
Shared
Function
InlineAssignHelper(Of T)(
ByRef
target
As
T,
ByVal
value
As
T)
As
T
target = value
Return
value
End
Function
Private
Sub
Button_Click(
ByVal
sender
As
System.
Object
,
ByVal
e
As
System.EventArgs)
For
Each
row
As
GridViewRowInfo
In
radGridView1.Rows
If
Not
row.Cells(
"Representative"
).Value
Is
Nothing
AndAlso
CBool
(row.Cells(
"Representative"
).Value)
Then
MessageBox.Show(
"Row "
+ row.Index.ToString +
" is checked!"
)
End
If
Next
End
Sub
End
Class
Public
Class
Person
Public
Property
ID()
As
Integer
Get
Return
m_ID
End
Get
Set
(
ByVal
value
As
Integer
)
m_ID = Value
End
Set
End
Property
Private
m_ID
As
Integer
Public
Property
Name()
As
String
Get
Return
m_Name
End
Get
Set
(
ByVal
value
As
String
)
m_Name = Value
End
Set
End
Property
Private
m_Name
As
String
Public
Property
Active()
As
Boolean
Get
Return
m_Active
End
Get
Set
(
ByVal
value
As
Boolean
)
m_Active = Value
End
Set
End
Property
Private
m_Active
As
Boolean
Public
Property
Representative()
As
Boolean
Get
Return
m_Representative
End
Get
Set
(
ByVal
value
As
Boolean
)
m_Representative = Value
End
Set
End
Property
Private
m_Representative
As
Boolean
End
Class
Hope this helps, if you have any other questions or comments, please let me know,
Best Regards,
Emanuel Varga
Telerik WinForms MVP
0
Accepted

Filleau
Top achievements
Rank 1
answered on 02 May 2011, 04:35 PM
This is it !
Big Thank.
Private
Sub
RadGridView1_ValueChanging(
ByVal
sender
As
System.
Object
,
ByVal
e
As
Telerik.WinControls.UI.ValueChangingEventArgs)
Handles
RadGridView1.ValueChanging
If
RadGridView1.CurrentColumn.Name =
"Master"
And
TypeOf
(e.NewValue)
Is
Boolean
Then
For
Each
row
As
GridViewDataRowInfo
In
RadGridView1.Rows
If
(row.Cells(
"Master"
).Value IsNot
Nothing
AndAlso
CBool
(row.Cells(
"Master"
).Value)
AndAlso
e.NewValue IsNot
Nothing
AndAlso
CBool
(e.NewValue) <>
False
)
Then
row.Cells(
"Master"
).Value =
False
End
If
Next
End
If
End
Sub
I made some minors changes because at the beginning I have some problem with your converter result, and also, but I don't know why sometime I got a exeption because a string value (from another column !)... That's why I test typeof(e.newValue)