我有一个这样的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包含用户及其角色的列表,在选择编辑时,角色列单元格变为包含角色的下拉列表(目前只有管理员和成员)。
我目前正在处理的问题是从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 = '?'));
Codebehind参数:
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
由于Retrieving Data Using the AccessDataSource Web Server Control中的这一行我使用?
: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
会返回名称吗?两条空行是否应该是值?如果是这样,他们为什么空着?
答案 0 :(得分:2)
如何用另一个模板字段替换绑定字段?您的标记应如下所示: 编辑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();
}
}
我已经测试了上面的代码。希望它有所帮助!
答案 1 :(得分:-1)