列表项删除不工作C#

时间:2015-01-09 12:44:06

标签: c#

我有一个列表,它从数据库中提取信息并填充行。

我终于摆脱了找不到控件但是删除按钮运行不正常的错误,页面重新加载但不对数据库采取任何操作。

我的想法是列表项本身不需要被删除,因为列表是在数据库的页面加载时填充的,包括回发,因此它不会通过被删除的行。

有人能指出我出错的方向吗?

修改

如下所述,我通过删除using:

对GetData()函数进行了更改
using (SqlDataAdapter sda = new SqlDataAdapter())
                    {
                        cmd.Connection = con;
                        sda.SelectCommand = cmd;
                        DataSet ds = new DataSet();
                        sda.Fill(ds);
                        return ds;
                    }

但是下面的ASP listview片段没有被带回theeLbl.Text用作控制ID,这是主要问题。

<asp:ListView ID="List1" runat="server" GroupItemCount="3" GroupPlaceholderID="gph1" ItemPlaceholderID="iph1">
        <ItemTemplate>
            <tr>
                <td>
                    <asp:Label ID="uCompanylbl" runat="server" Text='<%# Eval("uCompanyId")%>'></asp:Label>
                </td>

C#代码:

protected void deleteBtn_Click(object sender, EventArgs e)
{
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalConnection"].ConnectionString))
    {
        string query = @"DELETE FROM EndUser WHERE @someId = EndUser.uCompanyID;
                        DELETE FROM Company WHERE @someId = Company.Id;
                        DELETE FROM BAD WHERE @someId = BAD.Id;";
        using (SqlCommand cmd = new SqlCommand(query, con))
        {
            int deleted = 0;
            try
            {
                var theLbl = this.List1.FindControl("uCompanylbl") as Label;

                cmd.Parameters.AddWithValue("@someId", theLbl.Text);
                con.Open(); ;
                deleted = cmd.ExecuteNonQuery();
            }
            catch(Exception er)
            {
                Console.WriteLine(er.ToString());
            }

        }
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        List1.DataSource = this.GetData();
        List1.DataBind();
    }               
}

private DataSet GetData()
{
    // add connection code for error handling
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalConnection"].ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand("SelectProc", con))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter())
            {
                cmd.Connection = con;
                sda.SelectCommand = cmd;
                using (DataSet ds = new DataSet())
                {
                    sda.Fill(ds);
                    return ds;
                }
            }
        }
    }
}

3 个答案:

答案 0 :(得分:3)

                    using (DataSet ds = new DataSet())
                    {
                        sda.Fill(ds);
                        return ds;
                    }

您是否意识到,这意味着您在返回之前Dispose了您的DataSet?

答案 1 :(得分:1)

TL; DR - 这应解决您的问题,任何问题请告诉我!

不完全确定您的代码出现了什么问题,因为并非所有问题都存在。话虽如此,我最近有一个类似的问题,我试图抓住列表中所选项目的索引,但实际上并没有选择。

我已经尝试将您的代码与我的代码混合在一起,以便您能够查看错误发生的位置,并进行轻微修改以使您的代码启动并运行。如果有任何问题,请告诉我,我会尝试弥补。

您可以在后端C#或ASP中执行此操作,此示例我通过ASP中的SQL数据源访问了数据库。

<强> ASP:

    <asp:ListView ID="List1" runat="server" GroupItemCount="3" GroupPlaceholderID="gph1" ItemPlaceholderID="iph1" DataSourceID="sqlDataSource1">
                <ItemTemplate>
                 <tr>
                    <td>
                        <asp:Label ID="uCompanylbl" runat="server" Text='<%# Eval("uCompanyId")%>'/>
                    </td>
<td>
                        <asp:LinkButton ID="Select" runat="server" Text="Select" Font-Bold="true" CommandName="Select" />
                    </td>
                  </tr>
    </ItemTemplate>
    <SelectedItemTemplate>
                    <tr>
                        <td>
                            <asp:Label ID="hiding" runat="server" Text='<%# Eval("uCompanyId")%>' />
                        </td>
                        <td>
                            <asp:Button ID="deleteBtn" runat="server" Text="Delete" OnClick="deleteBtn_Click1"/>
                        </td>
    </tr>
    </SelectedItemTemplate>
    <asp:SqlDataSource ID="sqlDatasource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:LocalConnection%>" SelectCommand="SelectProc" CancelSelectOnNullParameter="true" DataSourceMode="DataReader">
        </asp:SqlDataSource>

你可能有一些已经有效的后端代码,但我认为最好能准确地说明我是如何工作的:通过所选索引(通过asp中的链接按钮将你带到selectedtemplate)中的id找到列表控件添加控制器id的名称以获取值,在我的情况下是我正在寻找的DB值,然后将字符串转换为int并传递给存储过程(如果不使用字符串查询,则你可以帮助它)以及选择/删除任何内容的所有数据库内容。

<强> C#:

protected void deleteBtn_Click1(object sender, EventArgs e)
        {
            using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalConnection"].ConnectionString))
            {
                using (SqlCommand cmd = new SqlCommand("DeleteProc", con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    try
                    {
                        ListViewItem item = List1.Items[List1.SelectedIndex];
                        Label hdn = (Label)item.FindControl("hiding");
                        string tmp = hdn.Text;
                        int sId = Int32.Parse(tmp);
                        cmd.Parameters.AddWithValue("someId", sId);
                        con.Open();
                        cmd.ExecuteNonQuery();
                    }
                    catch (Exception error)
                    {
                        Console.WriteLine(error.ToString());
                    }
                }
            }
        }

答案 2 :(得分:0)

你可以用另一种方式做到这一点

dataset ds= new dataset();
sda.fill(ds);
return ds;