Как получить WPF ListBox Text, отображаемый в окне ListBox? - PullRequest
0 голосов
/ 22 октября 2011

Я ПРОСТО пытаюсь установить значение ID (используя ListBox.SelectedValuePath) в WPF ListBox и показать связанный текст (Date) (используя ListBox.DisplayMemberPath) в окне ListBox. Проблема в том, что я не могу получить текст из окна ListBox! Я делал это много раз, используя ComboBox, но, похоже, он не работает с ListBox. ListBox не имеет свойства ListBox.Text, из которого можно получить текст, отображаемый в окне ListBox, в данном случае - дату. Вот мой код (я пытаюсь получить текст из окна lstBidPeriods для заполнения второго ListBox (lstHolidays), запрашивая базу данных о выходных днях для даты выбранного периода ставки, из lstBidPeriods):

    private void loadBidPeriods()
    {
        lstBidPeriods.DisplayMemberPath = "Text";
        lstBidPeriods.SelectedValuePath = "Value";
        //lstBidPeriods.ItemTemplate.RegisterName(
        lstBidPeriods.ItemsSource = func.GetBidPeriods(func.SelectedYear, func.SelectedMonth);
    }
    private void lstBidPeriods_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        lstHolidays.ItemsSource = null;
        DateTime date = DateConversions.MIN_DATE;
        Console.WriteLine("SelectedItem= " + lstBidPeriods.SelectedItem.ToString());
        Console.WriteLine("SelectedValue= " + lstBidPeriods.SelectedValue.ToString());
        Console.WriteLine("Items[index]= " + lstBidPeriods.Items[lstBidPeriods.SelectedIndex].ToString());
        if (DateTime.TryParse(lstBidPeriods.SelectedItem.ToString(), out date))
        {
            Console.WriteLine("BID date: " + date);
            lstHolidays.DisplayMemberPath = "Text";
            lstHolidays.SelectedValuePath = "Value";
            lstHolidays.ItemsSource = func.GetBidPeriodHolidays(date);
        }
        Console.WriteLine("NOW date: " + date);
    }

   public ArrayList GetBidPeriods(short selYear, byte selMonth)
    {
        DataTable periods = new DataTable();
        ArrayList list = new ArrayList();
        try
        {
            SqlConnection conn = openNewConnection();
            SqlCommand cmd = new SqlCommand("getBidPeriods", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@selMonth", SqlDbType.TinyInt);
            cmd.Parameters.Add("@selYear", SqlDbType.SmallInt);
            cmd.Parameters["@selMonth"].Value = selMonth;
            cmd.Parameters["@selYear"].Value = selYear;
            periods = GetDataTable(cmd);
            foreach (DataRow row in periods.Rows)
            {
                DateTime date = new DateTime((short)row["Bid_Year"], (byte)row["Bid_Month"], (byte)row["Bid_Day"]);
                list.Add(new ListContent(row["Bid_Id"].ToString(), date.ToShortDateString()));
            } 
            conn.Close(); conn.Dispose(); cmd.Dispose();
        }
        catch (Exception e)
        {
            message = "Error Obtaining Bid Periods: " + e.Message.ToString();
            FileWizard.writeDate(FileWizard.LOGFILE_DIRECTORY + "appExceptionLog_"
                + DateConversions.GetMonthName(now.Month) + now.Year.ToString() + ".log",
                "User: " + GFIFunctions.GFIUser + "\tClass: GFIDBInterface\tFunction: GetBidPeriods"
                + "\tException: " + message);
            MessageBox.Show("Notify System Administrator: " + message, "GFI RIDER Application Exception ");
        }
        return list;
    }
    public ArrayList GetBidPeriodHolidays(DateTime bidPeriodDateStartingWithDate)
    {
        DataTable holidays = new DataTable();
        ArrayList list = new ArrayList();
        try
        {
            SqlConnection conn = openNewConnection();
            SqlCommand cmd = new SqlCommand("getBidPeriodHolidays", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@bidHolidayDatesGreaterThanOrEqualTo", SqlDbType.DateTime);
            cmd.Parameters["@bidHolidayDatesGreaterThanOrEqualTo"].Value = bidPeriodDateStartingWithDate;
            holidays = GetDataTable(cmd);
            foreach (DataRow row in holidays.Rows)
            {
                list.Add(new ListContent(row["Bid_Holiday_Id"].ToString(), ((DateTime)row["Bid_Holiday_Date"]).ToShortDateString()));
            } 
            conn.Close(); conn.Dispose(); cmd.Dispose();
        }
        catch (Exception e)
        {
            message = "Error Obtaining Bid Period Holidays: " + e.Message.ToString();
            FileWizard.writeDate(FileWizard.LOGFILE_DIRECTORY + "appExceptionLog_"
                + DateConversions.GetMonthName(now.Month) + now.Year.ToString() + ".log",
                "User: " + GFIFunctions.GFIUser + "\tClass: GFIDBInterface\tFunction: GetBidPeriodHolidays"
                + "\tException: " + message);
            MessageBox.Show("Notify System Administrator: " + message, "GFI RIDER Application Exception ");
        }
        return list;
    }

ПОЖАЛУЙСТА: мне не нужно ничего связывать, поэтому не ходите туда. Это ДОЛЖНА быть ПРОСТАЯ процедура, а не что-либо сложное с НЕОБХОДИМОЙ привязкой.

1 Ответ

2 голосов
/ 22 октября 2011

Позвольте мне объяснить несколько вещей, которые вы делаете в своем коде, и ответ будет предельно ясен.

Вам предоставляется список объектов ListContent для списка.

lstBidPeriods.DisplayMemberPath = "Text";
lstBidPeriods.ItemsSource = func.GetBidPeriods(....

Итак, я предполагаю, что у вас есть публичное свойство в классе ListContent с именем «Text».Если это так, то ваш список будет отображаться, перечисляя идентификаторы ваших BidPeriods.Отлично.

Но вы также указали это:

lstBidPeriods.SelectedValuePath = "Value";

Этим вы немного измените работу выделения.Давайте рассмотрим различные свойства выбора.

lstBidPeriods.SelectedItem - возвращает фактический выбранный экземпляр ListContent, поскольку помните, что вы передали список экземпляров ListContent.

lstBidPeriods.SelectedValue - возвращаетсвойство «Значение» выбранного экземпляра ListContent - поэтому это строка даты

lstBidPeriods.SelectedIndex - возвращает индекс выбранного элемента в списке.

Таким образом, чтобы получить строку даты, используйте SelectedValue,

if (DateTime.TryParse(lstBidPeriods.SelectedValue.ToString(), out date))
{
   ...
}

Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...