2010-02-05 156 views
1

我有一个RadGrid,它具有以编程方式创建的行和列,并且有一个RadAjaxManager用于更新SelectedIndexChange上的另一个面板。 RadGrid也启用了滚动功能并禁用了多重选择。 RadGrid按照设想运行,但只要您滚动它就开始收集选定的项目。我设置了断点并通过手表进行了验证,SelectedItems.Count增长为1.这也防止了在滚动后选择先前选定的行。我尝试清除页面卸载事件中的选定项目,但是当它呈现时,它有时会显示多个选定项目。我有时说是因为它不符合这个问题。我注意到的唯一模式是滚动开始出现问题。即使将AllowMultiRowSelection设置为false,Telerik RadGrid也会选择多行

第二个问题是每次页面回发列标题消失。这一个完全让我感到困惑,不知道是什么原因造成的。

我希望对此有任何建议。我也会包含我的代码。谢谢,我为可怜的格式化道歉。我仍然试图弄清楚。

P.S.我所包含的代码被设置为为列和行创建文本,因此不需要实际的数据。您可以轻松复制和粘贴相同的代码,查看我所看到的内容。

<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].Add(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) 
{ 

} 
}  

回答

2

在检查你的代码后,我注意到当你在!Page.IsPostBack时在init上生成网格列。我从以前的Telerik支持沟通中知道,当你在页面上静态地显示网格时,你应该在PageLoad上建立列!Page.IsPostBack-他们指示我帮助主题,在联机帮助中搜索它。

此外,如果我记得我在发布说明中看到,几乎滚动和选择的项目有一些问题。它应该在最新的Q3 2009 SP2版本中修复。

迪克

+0

谢谢迪克的回复。您在某些已知问题的事实上是正确的,Telerik已通知我最新版本应该解决这些问题。所以我有一个工作,直到我们得到新的版本。解决方法是在Page_PreRender中检查SelectedItems.Count,如果大于1,则删除SelectedItems [0]。似乎现在工作。再次感谢。 – jhorton 2010-02-16 14:51:21

0

(抱歉,我不能帮助,但)你为什么不张贴到telerik forums或创建support ticket?通常你会在24小时内得到答案。

+0

我在那里有一个,但说实话,我从这里得到的答案比那里运气更多。 – jhorton 2010-02-05 18:14:11

0

这是一个按钮代码 这个代码可以帮助你删除的复选框您在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(); 
       } 
      } 

     } 
相关问题