Ниже представлен примеры, каким образом можно работать с CheckBox'ом в DataGrid'е.
<%@ Page Language="C#" %>
<script runat="server">
public class TestInfo {
public TestInfo(int i) {
_i = i;
}
int _i;
public int Id {
get {
return _i;
}
}
public string Name {
get {
return string.Format("Элемент #{0}",_i);
}
}
public bool Selected {
get {
return ((_i % 2) == 1);
}
}
}
TestInfo[] CreateDataSource() {
TestInfo[] ds = new TestInfo[10];
for(int i=0; i< 10;i++) {
ds[i] = new TestInfo(i);
}
return ds;
}
void Page_Load(object sebder, EventArgs e) {
if (!IsPostBack) {
dg.DataSource = CreateDataSource();
dg.DataKeyField = "Id";
dg.DataBind();
}
}
void OnMyButtonClick(object sender, EventArgs e) {
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach(DataGridItem item in dg.Items) {
if (item.ItemType == ListItemType.Item ||
item.ItemType == ListItemType.AlternatingItem) {
CheckBox cb = (CheckBox)item.FindControl("_checkBox");
if (cb.Checked) {
sb.AppendFormat("Элемент номер {0} выбран<br>",
dg.DataKeys[item.ItemIndex],
Environment.NewLine);
}
}
}
_myLabel.Text = sb.ToString();
}
</script>
<form runat="server">
<asp:DataGrid id="dg" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:CheckBox runat="server" id="_checkBox"
Checked='<%# DataBinder.Eval(Container.DataItem,"Selected")%>'/>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="Name" HeaderText="Name"/>
</Columns>
</asp:DataGrid>
<hr>
<asp:Button runat="server" id="_myButton"
Text="Проверить" OnClick="OnMyButtonClick"/>
<hr>
<asp:Label runat="server" id="_myLabel"/>
</form>
Так же можно определять изменившееся значение отдельно у каждого CheckBox'а.
<%@ Page Language="C#" %>
<script runat="server">
public class TestInfo {
public TestInfo(int i) {
_i = i;
}
int _i;
public int Id {
get {
return _i;
}
}
public string Name {
get {
return string.Format("Элемент #{0}",_i);
}
}
public bool Selected {
get {
return ((_i % 2) == 1);
}
}
}
TestInfo[] CreateDataSource() {
TestInfo[] ds = new TestInfo[10];
for(int i=0; i< 10;i++) {
ds[i] = new TestInfo(i);
}
return ds;
}
void Page_Load(object sebder, EventArgs e) {
if (!IsPostBack) {
dg.DataSource = CreateDataSource();
dg.DataKeyField = "Id";
dg.DataBind();
}
}
void OnStatusChecked(object sender, EventArgs e) {
CheckBox cb = (CheckBox)sender;
DataGridItem item = (DataGridItem)cb.Parent.Parent;
int id = (int)dg.DataKeys[item.ItemIndex];
_myLabel.Text = string.Format("Изменился №{0} - Текущее значение: {1}", id, cb.Checked);
}
</script>
<form runat="server">
<asp:DataGrid id="dg" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:CheckBox runat="server" id="_checkBox" autopostback="true"
OnCheckedChanged="OnStatusChecked"
Checked='<%# DataBinder.Eval(Container.DataItem,"Selected")%>'/>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="Name" HeaderText="Name"/>
</Columns>
</asp:DataGrid>
<hr>
<asp:Label runat="server" id="_myLabel"/>
</form>
Еще один способ получения выделенных CheckBox'ов в DataGrid'е показан ниже (по материалам топика CheckBox v DataGrid).
<%@ Page %>
<script runat="server" language="c#">
string _current = "";
void Page_Load(object sender, EventArgs e) {
if (IsPostBack) _current = "," + Request.Form["uid"].ToString() + ",";
_grid.DataSource = new int[] {1,2,3,4,5,6,7,8,9,10};
_grid.DataBind();
}
void OnSaveButtonClick(object sender, EventArgs e) {
Response.Write(Request.Form["uid"]);
}
string IsChecked(int id) {
if(_current.IndexOf("," + id.ToString() + ",") >= 0) {
return "checked";
} else {
return "";
}
}
</script>
<form runat="server">
<asp:DataGrid runat="server" id="_grid">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<input <%#IsChecked((int) DataBinder.Eval(Container, "DataItem"))%> type="checkbox" name="uid" value='<%# DataBinder.Eval(Container, "DataItem")%>'>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<ItemTemplate>
Item <%# DataBinder.Eval(Container, "DataItem")%>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
<asp:Button runat="server" Text="Save" Width="100px" onclick="OnSaveButtonClick"/>
</form>