我目前正在使用VS 2008进行开发(ASP.NET C#)。
目前我遇到了GridView的一些问题:
我使用DataSet(来自数据库的查询)将数据绑定到GridView DataSource,然后我有一个复选框,允许用户使用以下方法隐藏或显示列:
if (chkPhone.Checked == true) { strSQL += ", recruit_website as 'Website'"; }
现在我遇到的问题是,如何使用锚标记来包装这个特定的列行?因此,用户可以通过GridView直接访问相应的网站。
所以我使用的第一种方法是使用'RowDataBound'事件并执行类似的操作:
e.Row.Cells[7].Text = "<a href='" + e.Row.Cells[7].Text + '">Click Me</a>";
但问题来了,如果用户选择不显示此列,则列索引会有所不同。 (有更多选项供用户隐藏列,因此索引中的-1没有意义)
那么这种方法失败了,我尝试使用另一种在'RowDataBound'事件中使用DataRowView的方法:
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRowView rowView = (DataRowView)e.Row.DataItem;
rowView["Website"] = "something"; //something to deal with here
}
使用此方法,我可以使用列名从GridView获取值,但我无法设置值。
那么这种情况的最佳解决方案是什么?
答案 0 :(得分:1)
第二种解决方案是一种好方法,但你做错了:
RowDataBound事件遍历您的DataSource并逐行绑定GridView。因此,在使用DataSource时,您无法对其进行更改。
你应该这样做,逐行遍历你的DataSource(并修改你想要的值),但是在数据绑定之前,当不使用DataSource时 - &gt;在调用 yourGridView.DataBind()
之前=====编辑======
我为您提供另一种解决方案:
您可以在GridView中添加您想要HyperLink的列:
<asp:HyperLink ID="HLWebsite" runat="server"></asp:HyperLink>
然后,在RowDataBound中,绑定每个HyperLink:
if (e.Row.RowType == DataControlRowType.DataRow)
{
HyperLink HLWebsite = (HyperLink) e.Row.FindControl("HLWebsite");
DataRowView rowView = (DataRowView)e.Row.DataItem;
HLWebsite.NavigateURL = rowView["Website"].ToString();
}
希望它有所帮助。
答案 1 :(得分:1)
您仍然需要检查要执行哪些列,但我认为这可能会有所帮助
// Your code for filling dataset
foreach(dataTable theTable in dataSet.Tables)
{
foreach(DataRow row in theTable.Rows)
{
foreach(DataColumn cell in theTable.Columns)
{
string value = row[cell].ToString();
row[cell] = "<a href='" + value + "'>" + value + "</a>";
}
}
}
//Your databinding and stuff;
这也可能有效:
foreach(dataTable theTable in dataSet.Tables)
{
foreach(DataRow row in theTable.Rows)
{
foreach(DataColumn cell in theTable.Columns)
{
string value = row[cell].ToString();
HyperLink linker = new HyperLink();
DataColumn col = new DataColumn();
linker.NavigateUrl = value; // you need to change this so it works
col.DefaultValue = linker;
row[cell] = col;
}
}
}
最终猜测:这不是最佳选择,但它对我有用。除非在数据绑定之后,否则您需要先执行此操作。
foreach(GridViewRow row in GridView1.Rows)
{
foreach(TableCell cell in row.Cells)
{
string value = col.Text.toString();
col.Text = "<a href='" + value + "'>" + value + "</a>";
}
}
答案 2 :(得分:0)
结束我决定使用@Koen方法,但添加一个正则表达式来查看哪个字符串使其成为超链接。我是怎么做到的:
在GridView DataBind()之后我有了这段代码
if (chkWebsite.Checked == true)
{
foreach (GridViewRow row in gVRecruiterView.Rows)
{
foreach (TableCell cell in row.Cells)
{
string value = cell.Text.ToString();
if (System.Text.RegularExpressions.Regex.IsMatch(value, @"^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$"))
{
cell.Text = "<a href='" + value + "'>" + value + "</a>";
}
}
}
}
在这种情况下,至少就目前而言,它暂时解决了我的问题:P非常感谢那些提出解决方案的人们!