【问题标题】:Edit value in DataRowView在 DataRowView 中编辑值
【发布时间】:2014-10-28 08:20:05
【问题描述】:

我目前正在使用 VS 2008 进行开发(ASP.NET C#)。

目前我在使用 GridView 时遇到了一些问题:

我使用 DataSet(从数据库查询)将数据绑定到 GridView 数据源,然后我有一个复选框,允许用户使用以下方法隐藏或显示列:

    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 中获取值,但我无法设置值。

那么对于这种情况最好的解决方案是什么?

【问题讨论】:

  • 我有一个建议:您可能应该在数据绑定之前更改该列的值。这样您就不必担心用户对可见列的选择。希望对你有帮助
  • @Koen 是的,我在从 MS SQL 获取数据时尝试过使用 CONCAT,但是在 Gridview 中显示时,如果您知道如何将特定列编码为html 然后这个问题就解决了 :) 谢谢你的建议!
  • 与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.

标签: c# asp.net gridview webforms


【解决方案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>";
              }
          }

【讨论】:

  • 嗨,我曾尝试用这个循环做一些事情,结果与我使用 CONCAT 的结果相同,数据显示与 html 中的样子完全一样,而不是编码成为链接 :(
  • 好的,我将添加另一个可能解决问题的解决方案,不确定它是否有效,但您可以随时尝试让我知道发生了什么
  • 您好,我已经尝试过您的解决方案,但我不确定您所指的评论行要更改什么?无论如何通过设置 row[cell] = link;整个专栏都给我System.Web.UI.WebControls.HyperLink
  • @MiloJuakMuTou MM,有点害怕会发生这种情况。好吧,我再次编辑了它。但我还是不确定哈哈
  • 哈哈哈哈没关系,我花了最后 8 个小时进行测试,不介意再花 8 个小时:P 这次结果是.. 整个栏目都空了 LOL
【解决方案2】:

第二种解决方案是个好方法,但是你做错了:

RowDataBound 事件通过您的 DataSource 并逐行绑定 GridView。所以你不能在使用这个数据源的时候改变它。

你应该做同样的事情,逐行检查你的数据源(并修改你想要的值),但在数据绑定之前,当数据源不使用时 -> 在调用 yourGridView.DataBind() 之前

===== 编辑 ======

我为您提供另一种解决方案:

您可以添加到您的 GridView,在您想要超链接的列:

<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(); 

}

希望对你有帮助。

【讨论】:

  • 您好,感谢您提出解决方案!但是如何逐行获取特定的列值并进行相应的修改呢?
  • 你必须首先从数据集中获取你想要的数据,然后你可以遍历行,比如 foreach(DataRow row in yourTable.Rows)。然后对于每一行,将值设置为 row["Website"] = "something" ;
  • 嗨,是的,我对@Koen 提供的解决方案做了一些事情,但它的显示与&lt;a href='http://example.com'&gt;http://example.com&lt;/a&gt; 完全一样,而不是链接! :(
  • 您好,感谢您提供替代解决方案!但似乎我无法在我的 GridView 中添加HyperLink 控件,它只有HyperLinkField >
  • 这很奇怪通常你可以!嗯,我不知道 HyperLinkField,但我认为你可以做与我引用的完全相同的事情!也许属性有另一个名字。
【解决方案3】:

最后我决定使用@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 非常感谢那里的人们提出解决方案!

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 2018-11-25
    • 2015-08-03
    • 2017-05-22
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多