【发布时间】:2017-10-02 11:44:25
【问题描述】:
我有一个带有一组固定(写入 ASPX 标记)列的 GridView。在此列集合的末尾,在页面加载期间,我添加了另外几列(列数根据我存储的与网格实体相关的键值对的数量而变化)并设置控件的 ID我动态添加,与键相关:
//Dictionary<string, string> myDictionary ...
foreach (string in myDictionary.Keys)
{
var tf = new TemplateField();
tf.HeaderText = k;
tf.ItemTemplate = new Label("key_" + k);
gridview.Columns.Add(tf);
}
在 RowDataBound 事件期间,我查看键值对,调用 e.Row.FindControl 来查找应该具有该值的标签,并填充该值:
foreach (var k in myDictionary.Keys)
{
Label lb = (Label)e.Row.FindControl("key_" + k);
lb.Text = myDictionary[k];
}
这对于初始显示效果很好,但在回发时页面加载代码会再次运行。这时候gridview好像把我做的所有动态列都恢复了,但是还没有往里面放任何数据。如果我将我的列添加代码包装在if(!IsPostback) 中以防止在回发时再次添加它们。那么我将看到我最初添加的列,但它们是空白的。如果我不使用IsPostback 检查,那么我将在呈现的页面中看到一组重复的列:一个空白,另一个包含值。空白列中的控件似乎不再具有相同的 ID,因此当我的 RowDataBound 触发时,e.Row.FindControl("key_" + k) 返回 null。当然,如果我不检查回发,而只是再次添加列,则新添加的列集将包含具有正确命名 ID 的控件,并且它们将被填充..
为了应对不断增长的空白列集,我计划删除(在页面加载中)我动态添加的任何列,这些列已使用错误的单元格控件 ID 重新设置,然后再次添加它们。我可以通过在列集合中向后循环来做到这一点,直到我找到一个肯定是 ASPX 标记中存在的最后一列的列,但我唯一能看到识别该列的是分配的标题文本标记(因为它没有自己的 ID)。这是标记,例如:
这感觉像是一种糟糕的做事方式:
for(int i = gv.Columns.Count-1; gv.Columns[i].HeaderText != "Edit Profile"; i--)
gv.Columns.RemoveAt(i); //remove all columns after the 'Edit Profile' one
..尤其是因为如果标题文本更改,或者键值对列表曾经包含“编辑配置文件”作为键,则会等待发生错误..
但是我怎样才能更好地确定 gridview 中的哪一列,因为它是在标记中添加的,而不是动态添加的?
或者,是否有更好的方法来重复使用动态添加的列而不删除它们并重新添加它们(使用更正的 ID)?如前所述,它们在那里,但是单元格没有数据,并且当我在回发期间恢复网格时,单元格内的标签 ID 都已更改,因此我无法找到它们来恢复它们的值..
【问题讨论】: