我有一个列表,它从数据库中提取信息并填充行。
我终于摆脱了找不到控件但是删除按钮运行不正常的错误,页面重新加载但不对数据库采取任何操作。
我的想法是列表项本身不需要被删除,因为列表是在数据库的页面加载时填充的,包括回发,因此它不会通过被删除的行。
有人能指出我出错的方向吗?
修改
如下所述,我通过删除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;
}
}
}
}
}
答案 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;