Dropdownlist и Datareader - PullRequest
       31

Dropdownlist и Datareader

2 голосов
/ 09 апреля 2010

Попробовав множество решений, перечисленных в интернете, я очень растерялся У меня есть веб-приложение на C # / SQL, для которого я просто пытаюсь связать команду ExecuteReader с выпадающим списком, чтобы пользователь мог выбрать значение. Это проект VS2008 на ОС XP.

Как это работает, когда пользователь выбирает таблицу, я использую этот выбор в качестве входного параметра для метода из моего файла Datamatch.aspx.cs. Затем этот файл Datamatch.aspx.cs вызывает метод из моего файла класса ADONET.cs. Наконец, этот метод выполняет процедуру SQL, чтобы вернуть список столбцов из этой таблицы. (Это все таблицы в БД Adventureworks). Я знаю, что этот метод успешно возвращает список столбцов, если я выполняю этот SP в SSMS. Однако я не уверен, как определить, работает ли он в VS или нет.

Это должно быть просто. Как я могу это сделать? Вот часть моего кода. T-sQL, хранимый proc:

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 = 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 просто показывает мне один выпадающий список, в котором ничего нет. Другими словами, это не выбирается. Итак, как я могу убедиться, что средство чтения данных возвращает все 4 столбца и проверить их значения? Мне удалось найти в хранилище данных "COLUMN_NAME", но я не знаю, какие свойства искать для проверки имен столбцов.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2010

В методе ADONET_methods.DisplayTableColumns (targettable) перед возвратом dr проверьте, получаете ли вы некоторое значение для 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; 
} 
2 голосов
/ 09 апреля 2010

Не похоже, что вы фактически связываете выпадающий список где-либо в этом коде. Вам нужно сделать что-то вроде этого:

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" />
...