我有一个带有几个BoundFields的GridView到SQLDataSource(SelectCommand是一个存储过程)。 DataSourceId和DataKeyNames在GridView中指定(在aspx页面中)。这很好用。 GridView的一列是一个带有CheckBoxList的TemplateField和EditItemTemplate。 CheckBoxList的DataSource(从存储过程返回的DataSet.Table [0]),DataTextField,DataValueField和DataBind()在GridView1_RowDataBound事件中的代码后面设置。这也很好。 CheckBoxList的初始Checked状态在GridView1_RowDataBound事件中设置。 Checked状态由数据库表中的记录确定(一个名为Modules_Platforms的表,它链接Module Ids,GridView的DataKeyNames,Platform Ids,CheckBoxList的DataValueField)。当页面加载时CheckBoxList的Checked状态很好,但是当我单击GridView中的Edit链接时,正在编辑的行中的所有复选框都会丢失其Checked状态并且未被选中。单击“取消”时,将返回正确的“已检查”状态,单击“编辑”,选择复选框并单击“更新”,将显示正确的“已检查”状态。我希望单击“编辑”时复选框保持其“已检查”状态,这样用户就不必记住已选中并重新选择它们的那些。
我应该注意,当页面加载时没有启用CheckBoxList(在ItemTemplate中没有启用),但是在EditItemTemplate中启用了它。
我已经搜索过并且没有找到任何拥有如此复杂的GridView并且CheckBoxList与我的示例匹配的人。我将相同的代码放在GridView1_RowEditing()方法中,该方法绑定CheckBoxList并在GridView1_RowDataBound()中设置Checked值,这不起作用。然后我只将代码设置为GridView1_RowEditing()中的Checked状态,这也不起作用。我也尝试在下面显示的代码之前将GridView置于GridView1_RowEditing()的编辑模式中,但这也不起作用。
GridView中的行显示模块名称,CheckBoxList中每个项目的文本显示平台名称。平台名称在每一行中都相同,但Checked状态基于Module Id和Platform Id的组合,并从Modules_Platforms表中读取,如上面第一段所述。
我正在显示我的GridView(aspx)代码以及GridView1_RowDataBound()和GridView1_RowEditing()的代码。建议是非常需要的!感谢。
<asp:GridView ID="GridView1" runat="server" DataSourceID="ModulesDataSource" DataKeyNames="MODULE_ID" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" PageSize="50" OnRowDataBound="GridView1_RowDataBound" OnRowUpdating="GridView1_RowUpdating" OnRowEditing="GridView1_RowEditing" OnRowCreated="GridView1_RowCreated">
<RowStyle BackColor="#EFF3FB" />
<Columns>
<asp:CommandField ShowDeleteButton="False" ShowEditButton="True"/>
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" Runat="server" OnClientClick="return confirm('Are you sure you want to delete this record?');" CommandName="Delete">Delete</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="Module Id" DataField="MODULE_ID" SortExpression="MODULE_ID"></asp:BoundField>
<asp:BoundField HeaderText="Module Name" DataField="MODULE_NAME" SortExpression="MODULE_NAME"></asp:BoundField>
<asp:BoundField HeaderText="Key Designator" DataField="MODULE_DESIGNATOR" SortExpression="MODULE_DESIGNATOR"></asp:BoundField>
<asp:TemplateField HeaderText="Platforms">
<ItemTemplate>
<asp:CheckBoxList ID="cblPlatforms" runat="server" RepeatDirection="Horizontal" Enabled="false">
</asp:CheckBoxList>
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBoxList ID="cblPlatforms" runat="server" RepeatDirection="Horizontal">
</asp:CheckBoxList>
</EditItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="ModulesDataSource" runat="server" OnUpdated="ModulesDataSource_Updated" ConnectionString="ConnectionStrings:ConnString" SelectCommand="GetModules" SelectCommandType="StoredProcedure" UpdateCommand="UpdateModule" UpdateCommandType="StoredProcedure" DeleteCommand="DeleteModule" DeleteCommandType="StoredProcedure">
<DeleteParameters>
<asp:Parameter Name="MODULE_ID" Type="Int32" Direction="Input"/>
<asp:Parameter Direction="InputOutput" Name="Result" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="MODULE_ID" Type="Int32" Direction="Input"/>
<asp:Parameter Name="MODULE_NAME" Type="String" Direction="Input"/>
<asp:Parameter Name="MODULE_DESIGNATOR" Type="String" Direction="Input"/>
<asp:Parameter Direction="InputOutput" Name="Result" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
// Populate CheckBoxList controls from PLATFORM_MASTER table
if (e.Row.RowType == DataControlRowType.DataRow)
{
CheckBoxList cblPlatforms = (CheckBoxList)e.Row.FindControl("cblPlatforms");
DAL dal = new DAL();
DataSet dsPlatforms = new DataSet();
dsPlatforms = dal.GetPlatforms_Active();
if (dsPlatforms != null)
{
if (dsPlatforms.Tables != null)
{
if (dsPlatforms.Tables.Count > 0)
{
if (dsPlatforms.Tables[0] != null)
{
if (dsPlatforms.Tables[0].Rows != null)
{
if (dsPlatforms.Tables[0].Rows.Count > 0)
{
cblPlatforms.DataSource = dsPlatforms.Tables[0];
cblPlatforms.DataTextField = "PLATFORM";
cblPlatforms.DataValueField = "PLATFORM_ID";
cblPlatforms.DataBind();
}
} // end if (dsPlatforms.Tables[0].Rows != null)
} // end if (dsPlatforms.Tables[0] != null)
} // end if (dsPlatforms.Tables.Count > 0)
} // end if (dsPlatforms.Tables != null)
} // end if (dsPlatforms != null)
} // end if (e.Row.RowType == DataControlRowType.DataRow)
// Display CheckBoxList controls status (checked / unchecked) from MODULES_PLATFORMS table
if (e.Row.RowType == DataControlRowType.DataRow)
{
CheckBoxList cblPlatforms = (CheckBoxList)e.Row.FindControl("cblPlatforms");
DAL dal= new DAL();
DataSet dsModPlats = new DataSet();
dsModPlats = dal.GetModules_Platforms();
if (dsModPlats != null)
{
if (dsModPlats.Tables != null)
{
if (dsModPlats.Tables.Count > 0)
{
if (dsModPlats.Tables[0] != null)
{
if (dsModPlats.Tables[0].Rows != null)
{
if (dsModPlats.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < cblPlatforms.Items.Count; i++)
{
for (int j = 0; j < dsModPlats.Tables[0].Rows.Count; j++)
{
if (Convert.ToInt32(dsModPlats.Tables[0].Rows[j]["PLATFORM_ID"]) == Convert.ToInt32(cblPlatforms.Items[i].Value))
{
if (e.Row.Cells[2].Text != "")
{
if (Convert.ToInt32(e.Row.Cells[2].Text) == Convert.ToInt32(dsModPlats.Tables[0].Rows[j]["MODULE_ID"]))
{
cblPlatforms.Items[i].Selected = true;
}
}
}
}
}
}
} // end if (dsModPlats.Tables[0].Rows != null)
} // end if (dsModPlats.Tables[0] != null)
} // end if (dsModPlats.Tables.Count > 0)
} // end if (dsModPlats.Tables != null)
} // end if (dsModPlats != null)
} // end if (e.Row.RowType == DataControlRowType.DataRow)
}
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
CheckBoxList cblPlatforms = ((CheckBoxList)GridView1.Rows[e.NewEditIndex].FindControl("cblPlatforms"));
DAL dal= new DAL();
DataSet dsModPlats = new DataSet();
dsModPlats = dal.GetModules_Platforms();
if (dsModPlats != null)
{
if (dsModPlats.Tables != null)
{
if (dsModPlats.Tables.Count > 0)
{
if (dsModPlats.Tables[0] != null)
{
if (dsModPlats.Tables[0].Rows != null)
{
if (dsModPlats.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < cblPlatforms.Items.Count; i++)
{
for (int j = 0; j < dsModPlats.Tables[0].Rows.Count; j++)
{
if (Convert.ToInt32(dsModPlats.Tables[0].Rows[j]["PLATFORM_ID"]) == Convert.ToInt32(cblPlatforms.Items[i].Value))
{
if (GridView1.Rows[e.NewEditIndex].Cells[2].Text != "")
{
if (Convert.ToInt32(GridView1.Rows[e.NewEditIndex].Cells[2].Text) == Convert.ToInt32(dsModPlats.Tables[0].Rows[j]["MODULE_ID"]))
{
cblPlatforms.Items[i].Selected = true;
}
}
}
}
}
}
} // end if (dsModPlats.Tables[0].Rows != null)
} // end if (dsModPlats.Tables[0] != null)
} // end if (dsModPlats.Tables.Count > 0)
} // end if (dsModPlats.Tables != null)
} // end if (dsModPlats != null)
}