在DataRowView中编辑值

时间:2014-10-28 08:20:05

标签: c# asp.net gridview webforms

我目前正在使用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获取值,但我无法设置值。

那么这种情况的最佳解决方案是什么?

3 个答案:

答案 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\-\.\?\,\'\/\\\+&amp;%\$#_]*)?$"))
                {
                    cell.Text = "<a href='" + value + "'>" + value + "</a>";
                }
            }
        }
    }

在这种情况下,至少就目前而言,它暂时解决了我的问题:P非常感谢那些提出解决方案的人们!