将GridView编辑限制为仅一列

时间:2013-12-28 23:35:17

标签: c# asp.net gridview

我有一个这样的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( &quot;[id]&quot; , &quot;roles&quot; , &quot;[role] = '?'&quot;)
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会返回名称吗?两条空行是否应该是值?如果是这样,他们为什么空着?

2 个答案:

答案 0 :(得分:2)

如何用另一个模板字段替换绑定字段?您的标记应如下所示: 编辑2:关于你的第二个问题---

  1. 我会检查我的UpdateCommand以获取额外的行。我看不到了 在您的命令中关闭引用。我有这个UpdateCommand UpdateCommand="UPDATE users SET users.roleID = DLookup('[id]','roles', '[role]'=?) WHERE username = ?"而不是 在调试中有任何空行。

  2. 要查看该值,您必须获取参数DefaultValue 喜欢:AccessDataSourceUsers.UpdateParameters[0].DefaultValue

  3. 编辑:我认为您无法在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)

解决方案非常简单 在设计模式下打开aspx文件,然后将GridView编辑为下图 Edit the GridView Columns

然后将您要不可编辑的列标记为只读,如下所示

Read only -->true