簡単そうに見えますが、これがなかなか難しいです。
<asp:TemplateField HeaderText="ID" InsertVisible="False" SortExpression="id">
<ItemTemplate>
<a href="/visit.aspx?Id=<%#Eval("Id")%>" id="ID" name="ID"> <%#Eval("Id")%> </a>
</ItemTemplate>
</asp:TemplateField>
グリッドビューの最後の列にボタンがあります。このボタンをクリックすると、データベースが更新され、グリッドビューが更新されます。また、gridview の id 列を見て、編集された行を強調表示しようとします。
ID フィールドが境界フィールドであり、URL でない場合、コードは問題なく機能します。しかし、それが URL の場合、URL のテキスト値を読み取ることができないようです。私はさまざまな解決策を試しました(SOとオンラインからの助け)
ハイパーリンク リンク = (ハイパーリンク)row.FindControl("id"); // 動作しませんでした
((HyperLink)GridView1.Rows[i].Cells[0].Controls[0]).Text // 機能しませんでした
これは、助けが必要なコード スニペットです。
for (int i = 0; i < GridView1.Rows.Count; i++)
{
GridViewRow row;
row = GridView1.Rows[i];
if (row.RowType == DataControlRowType.DataRow)
{
HyperLink link = (HyperLink)row.FindControl("id");
if (((HyperLink)GridView1.Rows[i].Cells[0].Controls[0]).Text == button.CommandName)
{
row.BackColor = System.Drawing.Color.IndianRed;
}
}
}
私は正常に動作するIDフィールドを保存するためにbutton.CommandNameを使用しています。テンプレートフィールド内のグリッドビューにハイパーリンクコントロールが見つからないようです。
私には意味をなさない次のエラーが表示されます
タイプ 'System.Web.UI.DataBoundLiteralControl' のオブジェクトをタイプ 'System.Web.UI.WebControls.HyperLink' にキャストできません。
Update1 ハイパーリンク フィールドを使用しない場合、このコードは問題なく動作します。
for (int i = 0; i < GridView1.Rows.Count; i++)
{
GridViewRow row;
row = GridView1.Rows[i];
if (row.Cells[0].Text.Equals(button.CommandName))
{
row.BackColor = System.Drawing.Color.IndianRed;
}
}
列 0 をハイパーリンクに変更し、対応するコードを変更すると、機能しません。明らかに間違ったセルを読み取ることは問題ではありません。
for (int i = 0; i < GridView1.Rows.Count; i++)
{
GridViewRow row;
row = GridView1.Rows[i];
HtmlAnchor anchor = (HtmlAnchor) row.Cells[0].Controls[0];
if ( anchor.InnerText.Equals(button.CommandName))
{
row.BackColor = System.Drawing.Color.IndianRed;
}
}