假设我的GridView (ID& Name)中只有两列,每当我点击它时我都需要获取ID的值。例如,如果我点击 123 ,我应该 123 。但在这里......事实并非如此......当我点击任何ID时,它会返回该ID旁边的名称(例如;如果是123,我会得到Tony Stark ),但是当我点击后获取ID的值,它总是返回一个空字符串。
换句话说,我在id中获得了名称(当X = 1时),但是当X = 0时,id变为空字符串... (int X和string id:参见C#代码如下)
我的GridView中的XAML代码:
<asp:ButtonField
DataTextField="ID"
HeaderText="ID">
</asp:ButtonField>
<asp:BoundField
DataField="Name"
HeaderText="NAME">
</asp:BoundField>
C#:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
string id = GridView1.Rows[Convert.ToInt32(e.CommandArgument)].Cells[X].Text.ToString();
Response.Write(id);
}
出了什么问题?!!以及如何解决这个问题?谢谢!
答案 0 :(得分:1)
更复杂但更好的解决方案是:
在GridView中,使用DataKeyNames标记和RowCommand事件,并将绑定值放在DataKeyName中,例如:
DataKeyNames="ID" OnRowCommand="GridView1_RowCommand"
在gridview中使用模板字段(您不需要像下面的示例一样使用图像按钮):
<asp:TemplateField HeaderText="Action">
<HeaderStyle HorizontalAlign="Center" />
<ItemStyle HorizontalAlign="Left" Wrap="false" />
<ItemTemplate>
<div class="GridViewOpc">
<asp:ImageButton ID="buttonDelete" runat="server" Width="17" Height="17" AlternateText="Update"
CausesValidation="False" Visible="false" CommandName="Delete" Enabled="true"
ImageUrl="~/yourDeletepicture.gif" />
<asp:ImageButton ID="buttonUpdate" runat="server" AlternateText="Update" Width="17"
Height="17" CausesValidation="False" Visible="false" CommandName="Update" ImageUrl="~/yourUpdatePicture.gif" />
</div>
</ItemTemplate>
</asp:TemplateField>
在CodeBehind上获取它:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
Control ctl = e.CommandSource as Control;
GridViewRow CurrentRow = ctl.NamingContainer as GridViewRow;
if (e.CommandName == "Update")
{
int ID = Convert.ToInt32(GridView1.DataKeys[CurrentRow.RowIndex][0]);
}
if (e.CommandName == "Delete")
{
int ID = Convert.ToInt32(GridView1.DataKeys[CurrentRow.RowIndex][0]);
}
}
答案 1 :(得分:0)
不使用 templateField
您也可以从 ButtonField
获取值。
在您的 ButtonField
中,您需要给它一个 ButtonType
。
XML:
<asp:ButtonField ButtonType="Link" CommandName="PanelName" DataTextField="PANEL_NAME" HeaderText="Panel Name" runat="server" SortExpression="PANEL_NAME" text="PanleName"/>
代码:
if (e.CommandName == "PanelName")
{
string PanleName;
int index = Convert.ToInt32(e.CommandArgument);
GridViewRow selectedRow = dgSearchResult.Rows[index];
PanleName = ((LinkButton)selectedRow.Cells[1].Controls[0]).Text;
}
注意:无论您的单元格索引是什么,Cells[1] 表示索引为 1。但如果您的 GridView 中只有一个控件,则控件总是从 0 开始。
答案 2 :(得分:-1)
在你的RowCommand处理程序中,我认为这就是你想要的:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
int id = (int)(DataBinder.Eval(e.Row.DataItem, "ID"));
Response.Write(id);
}
}
我正在从vb转换,所以我可能错过了一些语法,但你明白了......