Telerik RadGrid selects multiple rows even with AllowMultiRowSelection set to false
I have a RadGrid that has it's rows and columns being created programatically, and there is a RadAjaxManager that is set to update another Panel on SelectedIndexChange. The RadGrid also has scrolling enabled and multirowselect disabled. The RadGrid operates as supposed to, but as soon as you scroll it starts collecting selected items. I have set break points and verified through watches that SelectedItems.Count grows greater that 1. This also prevents from selecting previous selected rows after you've scrolled. I have tried clearing the selected items in the page unload event, but when it renders it sometimes shows more than one item selected. I say sometimes because it is not consistent with this issue. Only pattern I have noticed is that scrolling starts the problem.
The second issue is that each time the page posts back the column headers disappear. This one totally baffles me, not sure what's the cause for it.
I would appreciate any advice on this. I'll include my code as well. Thanks, and I appologize for the poor formatting. I'm still trying to figure it out.
P.S. The code I've included is set up to create text for the columns and rows, so no actual data is needed. You can easily copy and paste the same code to see what I'm seeing.
<rad:RadScriptManager ID="scm" runat="server"> </rad:RadScriptManager>
<rad:RadAjaxManager ID="AjaxManager" runat="server">
<AjaxSettings>
<rad:AjaxSetting AjaxControlID="grdCustomerAssignments">
<UpdatedControls>
<rad:AjaxUpdatedControl ControlID="grdCustomerAssignments" LoadingPanelID="pnlLoading1" />
</UpdatedControls>
</rad:AjaxSetting>
<rad:AjaxSetting AjaxControlID="grdCustomerAssignments">
<UpdatedControls>
<rad:AjaxUpdatedControl ControlID="pnlDetails" />
</UpdatedControls>
</rad:AjaxSetting>
</AjaxSettings>
</rad:RadAjaxManager>
<rad:RadGrid ID="grdCustomerAssignments" runat="server" Skin="WebBlue" AutoGenerateColumns="false" AllowMultiRowSelection="false" OnNeedDataSource="grdCustomerAssignments_NeedDataSource" OnSelectedIndexChanged="grdCustomerAssignments_SelectedIndexChanged" OnSortCommand="grdCustomerAssignments_SortCommand">
<ClientSettings EnablePostBackOnRowClick="true" >
<ClientEvents/>
<Scrolling AllowScroll="true" ScrollHeight="350" UseStaticHeaders="true" SaveScrollPosition="true" />
<Selecting AllowRowSelect="true" />
<Resizing AllowColumnResize="true" />
</ClientSettings>
<MasterTableView DataKeyNames="ID" >
<HeaderStyle Wrap="false" HorizontalAlign="Center" VerticalAlign="Middle" Font-Bold="true" />
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Wrap="false" />
<AlternatingItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Wrap="false" />
<NoRecordsTemplate>
<div style="font-size:80%; color:Maroon;">No Items Were Found</div>
</NoRecordsTemplate>
</MasterTableView>
</rad:RadGrid>
<asp:Panel ID="pnlDetails" runat="server">
<rad:RadTabStrip ID="tabStrip" runat="server" Align="Justify" AppendDataBoundItems="false" SelectedIndex="0" MultiPageID="multiPage" Skin="WebBlue">
<Tabs></Tabs>
</rad:RadTabStrip>
<rad:RadMultiPage ID="multiPage" runat="server"></rad:RadMultiPage>
</asp:Panel>
protected DataTable Assignments { get; set; }
protected Dictionary<string, IList<int>> TabTitles { get; set; }
protected void Page_Init(object sender, EventArgs e)
{
GetAssignments();
if (!IsPostBack)
AddColumnsToGrid();
}
protected void Page_Load(object sender, EventArgs e)
{
tabStrip.Tabs.Clear();
multiPage.Controls.Clear();
}
protected void Page_UnLoad(object sender, EventArgs e)
{
grdCustomerAssignments.MasterTableView.ClearSelectedItems();
}
protected void grdCustomerAssignments_NeedDataSource(object source, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
{
grdCustomerAssignments.DataSource = Assignments;
}
protected void grdCustomerAssignments_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
string id = ((RadGrid)sender).SelectedValue.ToString();
DataRow dataRow = null;
foreach (DataRow row in Assignments.Rows)
{
if (row["ID"].ToString() == id)
dataRow = row;
}
PopulateAssignmentDetail(dataRow);
}
catch (Exception ex)
{
}
}
protected void PopulateAssignmentDetail(DataRow datarow)
{
// just some code to populate the tabs.
}
protected void AddColumnsToGrid()
{
grdCustomerAssignments.MasterTableView.Columns.Clear();
for (int i = 1; i < 7; i++)
{
DataColumn column = Assignments.Columns[i];
GridBoundColumn boundColumn = new GridBoundColumn();
boundColumn.HeaderText = column.Caption;
boundColumn.DataField = column.ColumnName;
grdCustomerAssignments.MasterTableView.Columns.Add(boundColumn);
}
}
private void GetAssignments()
{
if (Assignments == null)
Assignments = new DataTable();
if (TabTitles == null)
TabTitles = new Dictionary<string, IList<int>>();
try
{
Assignments.Columns.Add(new DataColumn("ID"));
for (int i = 0; i < 50; i++)
{
Assignments.Columns.Add(new DataColumn("Column" + i.ToString()));
}
int columnIndex = 0;
int tabIndex = 0;
foreach (DataColumn column in Assignments.Columns)
{
if (columnIndex > 5)
{
string fieldCategory = "tab" + tabIndex.ToString();
if (tabIndex == 4)
tabIndex = 0;
else
tabIndex++;
if (!TabTitles.ContainsKey(fieldCategory))
{
IList<int> tmp = new List<int>();
tmp.Add(columnIndex);
TabTitles.Add(fieldCategory, tmp);
}
else
TabTitles[fieldCategory].A开发者_StackOverflow社区dd(columnIndex);
}
columnIndex++;
}
for (int j = 0; j < 50; j++)
{
DataRow row = Assignments.NewRow();
foreach (DataColumn column in Assignments.Columns)
{
row[column.ColumnName] = column.ColumnName + "Row" + j.ToString();
}
Assignments.Rows.Add(row);
}
Assignments.AcceptChanges();
Session["Assignments"] = Assignments;
}
catch (Exception ex)
{
}
}
After inspecting your code I noticed that you generate the grid column on init when !Page.IsPostBack. I know from previous support communication with Telerik that when you have the grid statically on the page, you should build the columns on PageLoad when !Page.IsPostBack- they directed me to help topic, search for it in the online help.
Also if I recall well I read in release notes that there was some issue with virtually scrolling and selected items. It should be fixed in the latest Q3 2009 SP2 release.
Dick
(sorry I can't help, but) Why don't you post to the telerik forums or create a support ticket? Usually you'll get an answer within 24 hours.
this is a Button code this code may help you to delete multiple record which checkbox you have selected in your RadGrid.
protected void Button3_Click(object sender, EventArgs e)
{
Area_Master Area;
int i;
foreach (GridDataItem item in Grd_Area.Items)//loops through each grid row
{
CheckBox chkBx = (CheckBox)item.FindControl("chkArea");
if (chkBx.Checked)
{
i = Convert.ToInt32(item.Cells[3].Text); //accessing cell using its ColumnUniqueName
var query = from obj in cnx.Area_Master where obj.PKAreaID == i select obj;
Area = query.FirstOrDefault();
cnx.DeleteObject(Area);
cnx.SaveChanges();
}
}
}
精彩评论