下拉列表和Datareader

时间:2010-04-08 23:25:06

标签: c# asp.net drop-down-menu datareader

在尝试了互联网上列出的许多解决方案后,我现在非常困惑。我有一个C#/ SQL Web应用程序,我只是尝试将ExecuteReader命令绑定到Dropdownlist,以便用户可以选择一个值。这是XP OS上的VS2008项目。

它的工作原理是在用户选择一个表之后,我使用这个选项作为我的Datamatch.aspx.cs文件中方法的输入参数。然后,此Datamatch.aspx.cs文件从我的ADONET.cs类文件中调用一个方法。最后,此方法执行SQL过程以返回该表中的列列表。 (这些是Adventureworks DB中的所有表格)。我知道如果我在SSMS中执行此SP,此方法将成功返回列列表。但是,我不知道怎么判断它是否适用于VS.

这应该很简单。我怎样才能做到这一点?这是我的一些代码。 T-sQL存储过程:

CREATE PROCEDURE [dbo].[getColumnNames]
@TableName VarChar(50) AS
BEGIN
SET NOCOUNT ON;
SELECT col.name 'COLUMN_NAME' FROM sysobjects obj
INNER JOIN syscolumns col ON obj.id = col.id
WHERE obj.name = @TableName
END

当我从SSMS执行以下操作时,它为我提供了所需的输出:exec getColumnNames 'AddressType'

Datamatch.aspx.cs文件中的代码目前是:

private void CreateDropDownLists() {     SqlDataReader dr2 = ADONET_methods.DisplayTableColumns(targettable);

int NumControls = targettable.Length;
DropDownList ddl = new DropDownList();
DataTable dt = new DataTable();

dt.Load(dr2);

ddl.DataValueField = "id";
ddl.DataTextField = "text";
ddl.DataSource = dt;
ddl.DataBind();

for (int counter = 0; counter < NumberOfControls; counter++)
{
    ddl.ID = "DropDownListID " + (counter + 1).ToString();
    btnSubmit.Style.Add("top", "auto");
    btnSubmit.Style.Add("left", "auto");
    btnSubmit.Style.Add("position", "absolute");

    if (counter < 7)
    {
        ddl.Style["top"] = 100 * counter + 80 + "px";
        ddl.Style["left"] = 250 + "px";
        int bSubmitPosition = NumberOfControls * 100 + 80;
        btnSubmit.Style.Add("top", System.Convert.ToString(bSubmitPosition) + "px");
    }
    else if (counter >= 7)
    {
        ddl.Style["top"] = 100 * counter - 620 + "px";
        ddl.Style["left"] = 550 + "px";
        int bSubmitPosition = NumberOfControls * 100 - 620;
        btnSubmit.Style.Add("top", System.Convert.ToString(bSubmitPosition) + "px");
    }
    ddl.SelectedIndexChanged += new EventHandler(SelectedIndexChanged);
    ddl_ht.Add(counter, ddl.SelectedValue);

    pnlDisplayData.Controls.Add(ddl);
    pnlDisplayData.Controls.Add(new LiteralControl("<br><br><br>"));
    pnlDisplayData.Visible = true;
    pnlDisplayData.FindControl(ddl.ID);
    //  dr.Close();
}

}

private void CreateLabels() {     for(int counter = 0; counter&lt; NumberOfControls; counter ++)     {         标签lbl = new Label();         lbl.ID =“Label”+ counter.ToString();         lbl.Text = headers [counter];         lbl.Style [“position”] =“绝对”;         if(counter&lt; 7)         {             lbl.Style [“top”] = 100 * counter + 50 +“px”;             lbl.Style [“left”] = 250 +“px”;         }         否则if(counter&gt; = 7)         {             lbl.Style [“top”] =(100 * counter) - 650 +“px”;             lbl.Style [“left”] = 550 +“px”;         }

    pnlDisplayData.Controls.Add(lbl);
    pnlDisplayData.Controls.Add(new LiteralControl("<br><br><br>"));
}

}

ADONET_methods.DisplayTableColumns(targettable)是:

public static SqlDataReader DisplayTableColumns(string tt)
    {
        SqlDataReader dr = null;
        string TableName = tt;
        string connString = "Server=(local);Database=AdventureWorks;Integrated Security = SSPI";
        string errorMsg;
        SqlConnection conn2 = new SqlConnection(connString);
        SqlCommand cmd = new SqlCommand("getColumnNames");  //conn2.CreateCommand();

        try
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn2;
            SqlParameter parm = new SqlParameter("@TableName", SqlDbType.VarChar);
            parm.Value = "Person." + TableName.Trim();
            parm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(parm);
            conn2.Open();
            dr = cmd.ExecuteReader();

        }
        catch (Exception ex)
        {
            errorMsg = ex.Message;
        }
        return dr;
    }

上面的CreateLabels方法正确显示了标签。但是CreateDropDownLists方法只显示了一个没有任何内容的下拉列表。换句话说,它是不可选择的。 那么如何验证datareader是否返回所有4列并检查它们的值?我能够从datareader“COLUMN_NAME”找到,但我不知道要搜索哪些属性来验证列名称。

2 个答案:

答案 0 :(得分:2)

看起来你实际上并没有在这段代码中的任何地方绑定下拉列表。你需要做这样的事情:

ddl.DataTextField = "COLUMN_NAME";
ddl.DataValueField = "COLUMN_NAME";
ddl.DataSource = dr.ExecuteReader();
ddl.DataBind();

或者,您可以使用SqlDataSource控件在页面标记中完成所有操作。

  <asp:SqlDataSource
      id="SqlDataSource1"
      runat="server"
      DataSourceMode="DataSet"
      ConnectionString="myConnString"
      SelectCommand="myStoredProcedure"
      >
  </asp:SqlDataSource>

  <asp:MyDropDownList id="ddl" runat="server" DataSource="SqlDataSource1"
       DataTextField="COLUMN_NAME" DataValueField="COLUMN_NAME" />

答案 1 :(得分:2)

在返回dr之前的ADONET_methods.DisplayTableColumns(targettable)方法中,检查是否使用断点为dr.GetValue()获取了一些值

string temp;
while(dr.Read())
{
    temp = dr.GetValue();  //use a breakpoint here
}

而不是使用dataReader并将其加载到dataTable,您可以更好地使用dataAdapter直接填充dataTable

public static DataTable DisplayTableColumns(string tt) 
{ 
    Datatable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter();

    try 
    { 
        da.Fill(dt); 
    } 
    catch (Exception ex) 
    { 
        errorMsg = ex.Message; 
    } 

    string temp;
    foreach(DataRow row in dt.Rows)
    {
        foreach(DataColumn column in dt.Columns)
        {
            temp = (row[column]);  // use your breakpoint here
        }
    }

    return dt; 
}