dropdownList在更新期间预先选择的默认值

时间:2014-05-07 20:05:45

标签: asp.net

我有2张桌子: artikulli

tema    varchar(250)    
abstrakti   text
data_publikimit date    
path    varchar(350)    
keywords    varchar(350)    
kategoria_id    int

kategoria

id  int
emertimi    varchar(350)    

我有一个dropdownList,它显示所有" emertimi"当用户选择一个时,它会将该emertimi的id保存在表格中#art; artikulli"在列" kategoria_id"。 我的问题是更新。当我执行更新下拉列表时,不显示预先选择的数据库中存在的值,而是列表中的第一个值。

DropDownList drpdKategoria = e.Item.FindControl("drpdKategoria") as DropDownList;
            SqlConnection con = new SqlConnection(connection);
            string Qry = "select * from kategoria";
            string id = Request.QueryString["id"];                                 
            SqlDataAdapter da = new SqlDataAdapter(Qry, con);
            SqlDataAdapter did = new SqlDataAdapter(id, con);               
            DataSet ds = new DataSet();
            con.Open();
            da.Fill(ds);
            did.Fill(ds);
            string kategoria_id = "select kategoria_id from artikulli where id='" + id + "'";
            SqlDataAdapter dk = new SqlDataAdapter(kategoria_id, con);
            dk.Fill(ds);
            string emertimi = "select emertimi from kategoria where id='" + kategoria_id + "'";
            SqlDataAdapter de = new SqlDataAdapter(emertimi, con);
            de.Fill(ds);
            drpdKategoria.DataSource = ds;
            drpdKategoria.DataValueField = "id";
            drpdKategoria.DataTextField = "emertimi";              
            drpdKategoria.DataBind();               
            var defaultValue = drpdKategoria.Items.FindByText(emertimi);
            if (defaultValue != null)
                drpdKategoria.SelectedValue = defaultValue.Value;
            con.Close();
            con.Dispose();
            ds.Dispose();
            da.Dispose();
            did.Dispose();
            dk.Dispose();
            de.Dispose();

我做错了什么???

2 个答案:

答案 0 :(得分:1)

我不知道我是否帮助你,但我决定写作,因为我遇到了很多你所描述的麻烦。如果您为控件 drpdKategoria 设置了 AutoPostBack = true ,则每次在其中选择一个值时页面都会刷新。

如果您将数据绑定到Page_Load中的 drpdKategoria ,则可以使用:

     protected void Page_Load(object sender, EventArgs e)

     {
          if (!IsPostBack)

          {
               //bind data here
          }
     }

答案 1 :(得分:0)

具体看这些行:

string kategoria_id = "select kategoria_id from artikulli where id='" + id + "'";
SqlDataAdapter dk = new SqlDataAdapter(kategoria_id, con);
dk.Fill(ds);
string emertimi = "select emertimi from kategoria where id='" + kategoria_id + "'";

我不知道你在哪里有这个想法,但根据上面的评论和your previous question,你似乎真的坚持认为不知何故SQL查询字符串将从数据库中成为该查询的结果。它没有赢。 SQL查询的字符串将保留字符串。查询的结果与您使用它的方式一样,将位于DataSet对象中。

(注意:您每次都重复使用相同的DataSet对象。自从我使用ADO.NET对象以来已经有一段时间了,但我怀疑每次重新填充新结果时都会覆盖以前的查询结果。对于初学者,您可能希望至少使用单独的DataSet个对象,直到获得这个问题。)

所以这里的问题是你的emertimi查询看起来像这样:

select emertimi from kategoria where id='select kategoria_id from artikulli where id='3081''

这个问题显然不会奏效。首先是因为嵌套字符串会导致语法错误,其次是因为没有id值称为文字字符串 "select kategoria_id from artikulli where id='3081'"

变量kategoria_id只是一个字符串。即使您使用DataAdapter执行查询,也不会更改字符串。您要查找的ID值,即查询的结果,位于DataSet对象中。您将要检查它以确保存在值,但在第一个查询的成功方案中,ID值将位于:

ds.Tables[0].Rows[0][0]

这解析为数据集的第一个表,即该表的第一行,即该行中的第一个项。所以你可以这样做:

var kategoria_id_result = Convert.ToInt32(ds.Tables[0].Rows[0][0]);
string emertimi = "select emertimi from kategoria where id='" + kategoria_id_result + "'"

这将使用第一个查询的结果作为第二个查询的值,而不是使用第一个查询本身作为第二个查询的值。因此,最终寻找 的值,用于设置DropDownList中的默认选定项目也可以在某个地方的DataSet中查询SQL查询的结果。 (可能也在ds.Tables[0].Rows[0][0]中,因为后面的SQL查询执行会覆盖以前的查询。)

但请注意,您的代码还存在许多其他问题。仅举几例:

  • 此代码 极易受攻击 SQL Injection次攻击。 从不将用户输入(在本例中为Request.QueryString值)视为可执行SQL代码。使用parameterized queries将用户输入视为数据,而不是代码。 (在提供的链接中,要特别注意在Parameters对象上使用SqlCommand属性。)
  • 您的id值是数据库字符串还是整数?它们很可能是整数,但您的查询将它们视为字符串(通过将值包装在单引号中)。这可能会在执行数据库查询时导致错误。
  • 如前所述,您通过填写三个单独查询的结果重新使用相同的DataSet。这可能覆盖前两个查询的结果,只保留最后一个查询的结果。
  • 利用the using statement正确处理一次性物品。
  • 始终检查null值,尤其是在ADO.NET对象和DataSet的弱类型世界中。例如,在您引用ds.Tables[0]之前,您需要确保ds.Tables.Count大于0,否则您将收到错误。您的代码中有一个 lot 更多的位置,您需要执行这样的检查。 (例如,在您使用FindControl的开头。在尝试使用控件之前,应确保找到控件。)
  • 你的变量名真的很难理解。 dsdadiddk等等。当您的变量名称是描述其的有意义的单词时,您会发现代码更容易调试变量的目的。
  • 说到调试,您是否使用过调试器?在Visual Studio中的代码中放置断点,并在应用程序执行时检查这些点的运行时值。这将向您显示您遇到的许多问题,例如上述查询中的查询。
  • 使用try/catch blocks来更好地处理错误,尤其是在处理数据库等外部资源时。
  • 你的SQL执行都是熙熙攘攘,很难说出一个人的开始和其他人的结局。在与数据库交互时,最好将该代码封装在一个紧密的块中。打开连接,获取结果,关闭连接,处理资源。按顺序,不间断。保留数据库对象可能会导致代码中出现意外行为。

我希望这个答案没有过于批评或意味着,它真的不是那样的意图。这段代码有很多错误,我想避免这个单一的Stack Overflow问题成为help vampirism的一个主题。请完成some ADO.NET tutorials,并耐心地检查他们正在使用的对象以及这些对象正在做什么。查看对象的MSDN文档及其上设置的属性。以小步骤进行实验,一次更改一件事并检查它如何修改代码的运行时行为(使用调试器)。理解代码及其工作方式。不要只是复制/粘贴代码示例,并期望它们以您认为应该的方式工作。