[英]Limit GridView edit to only one column
我有这样一个gridview设置:
<asp:GridView ID="GridViewUsers" runat="server"
DataSourceID="AccessDataSourceUsers"
AllowSorting="True" AutoGenerateColumns="False" AutoGenerateEditButton="True">
<Columns>
<asp:BoundField DataField="username" HeaderText="username"
SortExpression="username" />
<asp:TemplateField HeaderText="role" SortExpression="role">
<EditItemTemplate>
<asp:DropDownList ID="DropDownListRoles" runat="server"
DataSourceID="AccessDataSourceRoles" DataTextField="role" DataValueField="role"
SelectedValue='<%# Bind("role") %>'>
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("role") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
因此,Gridview包含用户及其角色的列表,在选择“编辑”后,角色列单元格将变为包含角色的下拉列表(当前仅是Admin和Member)。
我当前要解决的问题是将适当的值从gridview(用户名和下拉列表中的选定值)获取到更新查询的参数中。
当前代码隐藏:
protected void AccessDataSourceUsers_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
GridViewRow row = GridViewUsers.Rows[GridViewUsers.EditIndex];
DropDownList ddl = (DropDownList)row.FindControl("DropDownListRoles");
AccessDataSourceUsers.UpdateParameters.Add("@role", ddl.SelectedValue);
AccessDataSourceUsers.UpdateParameters.Add("@username", row.Cells[0].Text);
}
我设法很好地获得了下拉列表的选定值,但是我无法获得用户名,而是只得到一个空字符串。 我假设这是因为在单击“编辑”后,“用户名”字段变成了一个文本框。
我如何防止编辑用户名列,以使单元格不会变成文本框(我只希望角色列可编辑)。 并且这是否会自动解决通过row.Cells[0].Text
获取值的问题,或者我在这里还缺少其他东西吗?
编辑:问题2 。:参数和查询
我的更新命令如下所示:
UpdateCommand="UPDATE users
SET users.roleID = DLookup( "[id]" , "roles" , "[role] = '?'")
WHERE ((username = '?'));
代码隐藏参数:
protected void GridViewUsers_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = GridViewUsers.Rows[GridViewUsers.EditIndex];
DropDownList ddl = (DropDownList)row.FindControl("DropDownListRoles");
Label lbl = (Label)row.FindControl("LabelItemEditUsername");
if (ddl != null && ddl.SelectedValue != null && lbl != null)
{
AccessDataSourceUsers.UpdateParameters.Add("?", System.Data.DbType.String, ddl.SelectedValue); // I've also tried this without specifying the DbType
AccessDataSourceUsers.UpdateParameters.Add("?", System.Data.DbType.String, lbl.Text);
int result = AccessDataSourceUsers.Update();
System.Diagnostics.Debug.WriteLine(AccessDataSourceUsers.UpdateCommand);
System.Diagnostics.Debug.WriteLine(AccessDataSourceUsers.UpdateParameters[0]);
System.Diagnostics.Debug.WriteLine(AccessDataSourceUsers.UpdateParameters[1]);
System.Diagnostics.Debug.WriteLine(result);
}
else
{
e.Cancel = true;
}
}
单击gridview上的更新后,输出中的调试值为:
UPDATE users
SET users.roleID = DLookup( "[id]" , "roles" , "[role] = '?'")
WHERE ((username = '?'));
?
?
0
我正在使用?
由于使用AccessDataSource Web服务器控件检索数据中的这一行: Because the AccessDataSource control extends the SqlDataSource class and uses the System.Data.OleDb provider, you specify parameter placeholders using the "?" placeholder character. The System.Data.OleDb provider does not support named parameters;
Because the AccessDataSource control extends the SqlDataSource class and uses the System.Data.OleDb provider, you specify parameter placeholders using the "?" placeholder character. The System.Data.OleDb provider does not support named parameters;
奇怪的是,有两个空行,然后是两个占位符名称。 AccessDataSourceUsers.UpdateParameters[0]
应该返回参数的值, AccessDataSourceUsers.UpdateParameters[0].Name
返回名称? 这两个空行应该是值吗? 如果是这样,为什么它们是空的?
如何将绑定字段替换为另一个模板字段? 您的标记应如下所示: 编辑2:关于第二个问题---
我会检查我的UpdateCommand是否有多余的行。 在您的命令中看不到封闭的引号。 我有这个UpdateCommand UpdateCommand="UPDATE users SET users.roleID = DLookup('[id]','roles', '[role]'=?) WHERE username = ?"
并且在调试中没有任何空行。
要查看该值,您必须获取参数的DefaultValue
: AccessDataSourceUsers.UpdateParameters[0].DefaultValue
。
编辑:我认为您不能在AccessDatasource_Updating中设置参数。 GridView的RowUpdating是执行此操作的更好位置。
<asp:GridView ID="GridViewUsers" runat="server"
DataSourceID="AccessDataSourceUsers"
AllowSorting="True" AutoGenerateColumns="False" AutoGenerateEditButton="True" OnRowUpdating="GridViewUsers_RowUpdating">
<Columns>
<asp:TemplateField HeaderText="username" SortExpression="username">
<EditItemTemplate>
<asp:Label ID="lblUserName" runat="server" Text='<%# Bind("username") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblUserName" runat="server" Text='<%# Bind("username") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="role" SortExpression="role">
<EditItemTemplate>
<asp:DropDownList ID="DropDownListRoles" runat="server"
DataSourceID="AccessDataSourceRoles" DataTextField="role" DataValueField="role"
SelectedValue='<%# Bind("role") %>'>
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("role") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
您可以在代码的模板字段中找到标签:
protected void AccessDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
// Moved code to the method below
}
protected void GridViewUsers_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = GridViewUsers.Rows[GridViewUsers.EditIndex];
var ddl = row.FindControl("DropDownListRoles") as DropDownList;
var lblUserName = row.FindControl("lblUserName") as Label;
if (ddl != null && ddl.SelectedValue != null && lblUserName != null)
{
AccessDataSourceUsers.UpdateParameters.Add("@role", ddl.SelectedValue);
AccessDataSourceUsers.UpdateParameters.Add("@username", lblUserName.Text);
AccessDataSourceUsers.Update();
}
}
我已经测试了上面的代码。 希望能帮助到你!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.