C#: при заполнении поля со списком из хранимой процедуры отображается только первый элемент - PullRequest
1 голос
/ 16 февраля 2020

Я пытаюсь заполнить комбинированный список при инициализации, выполнив хранимую процедуру. Когда я запускаю процедуру в моей БД, появляются 3 строки:

enter image description here

Но как только я выполню процедуру в своем коде:

public partial class AddInstitutionStart : Window
    {
        public AddInstitutionStart()
        {
            InitializeComponent();
            ComboBoxInstitutionCategory.Items.Add(FillCombo.fillInstCategory());
        }
    }

    public static class FillCombo
    {
        public static string fillInstCategory()
        {
            string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
            SqlConnection Connect = null;
            SqlCommand Command;
            using (Connect = new SqlConnection(connstr))
            {
                Connect.Open();
                using (Command = new SqlCommand("[dbo].[spMetadataTb_GetCategory]", Connect))
                {
                    Command.CommandType = CommandType.StoredProcedure;
                    SqlDataReader dr = Command.ExecuteReader();
                    while (dr.Read())
                    {
                        string categoryInst = dr.GetString(0);
                        return categoryInst;
                    }
                }

                Command.Dispose();
                Connect.Close();
                return "-2";
            }
        }
    }

Отображается только первая строка:

enter image description here

Я использовал те же логи c, чтобы заполнить другой комбинированный список (не при инициализации) и работает отлично и отображает несколько элементов. Любая идея о том, что я могу делать здесь не так?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Тонны возможных решений для этого, но, пожалуйста, забудьте stati c!

1st:

вернуть список из другой ответ, используйте его так:

public partial class AddInstitutionStart : Window
{
    public AddInstitutionStart()
    {
        InitializeComponent();
        foreach(string cat in new FillCombo().fillInstCategory())
            ComboBoxInstitutionCategory.Items.Add(cat);
    }
}

или, если существует AddRange:

public partial class AddInstitutionStart : Window
{
    public AddInstitutionStart()
    {
        InitializeComponent();
        ComboBoxInstitutionCategory.Items.AddRange(new FillCombo().fillInstCategory());
    }
}

Это первое решение заполняет список в fillInstCategory(), а затем заполняет combobox через foreach или addrange.

2nd:

сделать его перечисляемой функцией (используйте то же, что и выше):

Только 2 изменения в вашем коде , 1-е:

public IEnumerable<string> GetInstCategory()
{
    ...
}

, затем расширите слово return на yield :

        while (dr.Read())
            yield return dr.GetString(0);

, заполняет комбинированный список сразу после каждого чтения данных (не один раз, когда все данные читаются как с решением 1), потому что приводит к вызывает скачок назад и вперед между Items.Add и While(dr.Read()) части кода.

3-й:

введите метод (или лямбда-выражение):

Только 2 изменения в вашем коде, 1-е:

public void GetInstCategory(Action<string> Injection)
{
    ...
}

затем:

        while (dr.Read())
            Injection(dr.GetString(0));

Используйте это как:

public partial class AddInstitutionStart : Window
{
    public AddInstitutionStart()
    {
        InitializeComponent();
        new FillCombo().fillInstCategory(ComboBoxInstitutionCategory.Items.Add)) //note there is no "(" and ")" after Add, so the addition doesnt happen, just the function was passed to "fillInstCategory" to use it whenever necessary.
    }
}

Это заполняет ваш комбинированный список так же, как и решение 2: читает 1 данные, затем добавляет 1 в комбинированный список, затем снова читает ...

Надеюсь, вы чему-то научитесь из этого.

0 голосов
/ 16 февраля 2020

Примерно так ... утилизируйте только своего читателя.

public static List<string> fillInstCategory()
{
    string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
    SqlConnection Connect = null;
    SqlCommand Command;
    List<string> categories = new List<string>();
    using (Connect = new SqlConnection(connstr))
    {
        Connect.Open();
        using (Command = new SqlCommand("[dbo].[spMetadataTb_GetCategory]", Connect))
        {
            Command.CommandType = CommandType.StoredProcedure;
            SqlDataReader dr = Command.ExecuteReader();
            while (dr.Read())
            {
                string categoryInst = dr.GetString(0);
                categories.Add(categoryInst);
            }
        }

        Command.Dispose();
        Connect.Close();
        return categories;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...