GrpSMK Ответов: 1

Gridview показывает только один столбец данных


У меня есть выпадающий список(tablenames) если я выберите любое имя таблицы из выпадающего списка, имена столбцов, отображаемых в списке(все колонне название от выбранного dropdwon стол,когда я несколько выберите имя столбца(списка) я хочу для отображения всех данных(выбранных столбцов в ListBox) в табличном виде с несколькими столбцами.

ошибка
в то время как множественный выбор элементов GridView отображается только один столбец(персонализация).помогите мне связать несколько столбцов в виде сетки.

Что я уже пробовал:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;


namespace entity
{
    public partial class _Default : System.Web.UI.Page
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["constr"].ConnectionString);
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            /*  if (DropDownList1.SelectedValue == DropDownList1.SelectedItem.Text)
              {
                  string query = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="+ "DropDownList1.SelectedItem.Text+" ;
                  DataTable dt = _Default.ExecuteQuery(query);
                  ListBox1.Items.Clear();
                  ListBox1.DataSource = dt;
                  ListBox1.DataBind();

              }*/
            string query = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='" + DropDownList1.SelectedItem.Text + "'";



            using (SqlCommand cmd = new SqlCommand(query))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    cmd.Connection = con;
                    sda.SelectCommand = cmd;
                    using (DataSet ds = new DataSet())
                    {

                        sda.Fill(ds);
                        ListBox1.DataMember = "COLUMN_NAME";
                        ListBox1.DataValueField = "COLUMN_NAME";
                        ListBox1.DataSource = ds.Tables[0];
                        ListBox1.DataBind();

                    }

                }
            }
        }







        protected void Button2_Click(object sender, EventArgs e)
        {

            //ListBox1_SelectedIndexChanged(sender, e);
            if (ListBox1.Items.Count > 0)
            {

                DataTable dt = new DataTable();

                DataSet ds = new DataSet();

                for (int i = 0; i < ListBox1.Items.Count; i++)
                {
                    if (ListBox1.Items[i].Selected)
                    {
                        string Listbfrom = ListBox1.Items[i].Text;





                        con.Open();

                        string str = "SELECT  " + Listbfrom + "  FROM  " + DropDownList1.SelectedItem.Text;

                        SqlCommand com = new SqlCommand(str, con);

                        DataSet dsBooking = new DataSet();

                        SqlDataAdapter dap = new SqlDataAdapter(com);

                        dap.Fill(dsBooking);

                        con.Close();


                        

                            GridView1.DataSource = dsBooking;

                            GridView1.DataBind();

                        

                    }

                }

            }



        }

       /* protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ListBox1.Items.Count > 0)
            {

                DataTable dt = new DataTable();

                DataSet ds = new DataSet();

                for (int i = 0; i < ListBox1.Items.Count; i++)
                {
                    if (ListBox1.Items[i].Selected)
                    {
                        string Listbfrom = ListBox1.Items[i].Text;





                        con.Open();

                        string str = "SELECT  " + Listbfrom + "  FROM  " + DropDownList1.SelectedItem.Text;

                        SqlCommand com = new SqlCommand(str, con);

                        DataSet dsBooking = new DataSet();

                        SqlDataAdapter dap = new SqlDataAdapter(com);

                        dap.Fill(dsBooking);

                        con.Close();


                        {

                            GridView1.DataSource = dsBooking;

                            GridView1.DataBind();

                        }

                    }

                }

            }

        }
*/
    }
}

[no name]

Что вы подразумеваете под "пока множественного выбора элементов GridView отображается только один столбец(персонализация)." Поделитесь более подробной информацией..

GrpSMK

в списке множественного выбора,GridView с указанием последнего выделенного столбца имя только

[no name]

Все еще не ясно. Но я вижу 1 проблему, поскольку вы привязываете данные к gridview в цикле for, поэтому он привязывает только последний элемент в вашей коллекции.

Попробуйте переместить ниже 2 операторов из цикла for, это должно сработать.

GridView1. DataSource = dsBooking;
Управления gridview1.Привязку();

GrpSMK

да, это моя проблема,как ее решить

[no name]

Как уже было сказано, Когда вы привязываете свои данные к представлению сетки, переместите их из цикла for.

GrpSMK

я пытался, но получал ошибку. вся моя объявленная переменная находится только внутри цикла for.тогда как же его двигать?

[no name]

При заполнении набора данных переместите его из цикла. Каждый раз, когда вы повторяете новый элемент в цикле, вы создаете новый набор данных, заставляя его удерживать только последний элемент в вашем списке и удалять ранее добавленный элемент. Таким образом, в конце концов у вас есть только последний элемент в DS для привязки элемента управления видом сетки.

GrpSMK

да, сделано, большое вам спасибо..

1 Ответов

Рейтинг:
10

CHill60

Как отметил вино Джангл, вы выполняете запрос для столбца в цикле - на самом деле вам нужно получить список столбцов, выбранных в список, разделенный запятыми, и использовать его.

Вы также должны использовать параметризованные запросы-никогда, никогда не объединяйте строки для создания sql-команд.

Попробуйте вместо этого:

protected void Button2_Click(object sender, EventArgs e)
{

    if (ListBox1.Items.Count > 0)
    {
        List<string> listbfrom = new List<string>();

        for (int i = 0; i < ListBox1.Items.Count; i++)
            if (ListBox1.Items[i].Selected)
                listbfrom.Add(ListBox1.Items[i].Text);

        string csv = string.Join(",", listbfrom);

        con.Open();

        string str = "SELECT @listbfrom FROM  @tabfrom";

        using (SqlCommand com = new SqlCommand(str, con))
        {
            com.Parameters.AddWithValue("@listbfrom", csv);
            com.Parameters.AddWithValue("@tabfrom", DropDownList1.SelectedItem.Text);
            DataSet dsBooking = new DataSet();
            SqlDataAdapter dap = new SqlDataAdapter(com);

            dap.Fill(dsBooking);
            con.Close();
        }

        GridView1.DataSource = dsBooking;
        GridView1.DataBind();
    }
}

Если у вас есть дополнительные вопросы, пожалуйста, не включайте закомментированный код или пустые методы. Публикуйте только тот код, с которым у вас возникли проблемы.

[EDIT] приведенное выше решение работает только для .NET 4 и выше. Для замены .NET 3.5
string csv = string.Join(",", listbfrom);
с
string csv = string.Join(",", listbfrom.ToArray());


GrpSMK

строки CSV = строка.Join (",", listbfrom); здесь ошибка

CHill60

В чем же ошибка?

GrpSMK

да, это хорошо, опять Еще одна ошибка..Необходимо объявить табличную переменную "@tabfrom".

CHill60

Кажется, я заметил проблему. Я обновил свое решение

GrpSMK

Спасибо, я решил свою проблему.