2

クエリ文字列で渡された値に基づいて、バインドされていない DropDownList の値を設定しようとしています。これが私のコードです:

ListItem item = null;
            for (int x = 0; x < 60; x++)
            {
                item = new ListItem(x.ToString("D2"), x.ToString("D2"));
                ddStartMinutes.Items.Add(item);
                ddEndMinutes.Items.Add(item);
                if (x < 24)
                {
                    ddStartHours.Items.Add(item);
                    ddEndHours.Items.Add(item);
                }
            }

        if (Request.QueryString.Count > 5)
        {
            string startDate = Request.QueryString["startDate"];
            string startHour = Request.QueryString["startHour"];
            string startMin = Request.QueryString["startMin"];
            string endDate = Request.QueryString["endDate"];
            string endHour = Request.QueryString["endHour"];
            string endMin = Request.QueryString["endMin"];
            string cabinet = Request.QueryString["cabinet"];

            txtStartDate.Text = startDate;
            txtEndDate.Text = endDate;
            ddStartHours.SelectedValue = startHour;
            ddStartMinutes.SelectedValue = startMin;
            ddEndHours.SelectedValue = endHour;
            ddEndMinutes.SelectedValue = endMin;
            ddCabinets.SelectedValue = cabinet;

            runReport();
        }

ドロップダウン リストを作成することから始めて、クエリ文字列に基づいて選択した値を設定しようとします。すべてのドロップダウンが、正しい値ではなく endMin の値に設定されます。

runReport(); の直前にブレークポイントをデバッグして追加すると、各文字列変数にはクエリ文字列からの正しい値が含まれていることがわかりますが、DropDownList selectedValues のそれぞれはクエリ文字列値ではなく endMin に設定されています。

たとえば、クエリ文字列で startHour が 1、startMin が 2、endHour が 3、endMin が 4 の場合、各文字列変数はクエリ文字列から正しく設定されますが、ドロップダウンで選択された値はすべて 4 に設定されます。

私はかなり困惑しています。何か案は?

4

4 に答える 4

3

ListItem問題は、ドロップダウン間で sを共有することです。それを修正するには、次を使用します。

for (int x = 0; x < 60; x++) 
{ 
    var value = x.ToString("D2");
    ddStartMinutes.Items.Add(new ListItem(value, value));
    ddEndMinutes.Items.Add(new ListItem(value, value));
    if (x < 24) 
    { 
        ddStartHours.Items.Add(new ListItem(value, value));
        ddEndHours.Items.Add(new ListItem(value, value));
    }
}
于 2012-08-09T15:07:13.630 に答える
0

以下を使用できます

ddStartHours.Items.FindByValue(startHour).Selected = true;

これは値を適切に設定する必要がありますが、上記の拡張機能はこれを行っていますが、上記のコードの1行で行うことができます

于 2012-08-09T14:08:17.603 に答える
0

クエリ文字列を介して渡された値が常にドロップダウン リストにあることがわかっていると仮定すると、次のようにすることができます。

ddStartHours.Items.FindByValue(startHour) = true;

安全のために; 次のように null チェックをいつでも追加できます。

var item = ddStartHours.Items.FindByValue(startHour);
if(item != null)
     item.Selected = true;

編集:

もう一度見てください。ドロップダウン間の共有アイテムが原因のようです。あなたが持っていてListItem1、それを両方に追加するddStartHours場合ddEndHours; どちらかを選択すると、もう一方も選択されます。

おそらくリファクタリングして、時間と分の両方の ListItems のコレクションを返す静的メソッドを作成し、それを使用してドロップダウン リストにバインドします。

于 2012-08-09T14:11:05.240 に答える
0

これは、DropDownList の「欠陥」です。この拡張機能を使用して回避します。

    /// <summary>
    /// Sets the selected item by value.
    /// </summary>
    /// <param name="list">Drop down list to select value on</param>
    /// <param name="value">Value to select</param>
    public static void SetSelectedByValue(this DropDownList list, string value)
    {
        var listItem = list.Items.FindByValue(value);
        if (listItem != null)
        {
            list.SelectedIndex = list.Items.IndexOf(listItem);
        }
    }

提供されたソースでの使用法:

            ddStartHours.SetSelectedByValue(startHour);
            ddStartMinutes.SetSelectedByValue(startMin);
            ddEndHours.SetSelectedByValue(endHour);
            ddEndMinutes.SetSelectedByValue(endMin);
            ddCabinets.SetSelectedByValue(cabinet);
于 2012-08-09T14:01:10.863 に答える