3

私は次のような atext boxと aを持っていRadComboBoxます:

<asp:TextBox ID="txt_inner_emp_num" runat="server" Width="60px" 
ontextchanged="txt_inner_emp_num_TextChanged" AutoPostBack="true"></asp:TextBox>
<telerik:RadComboBox ID="rad_ddl_inner_emp_name" runat="server" CausesValidation="False"
CollapseDelay="0" Culture="ar-EG" ExpandDelay="0" Filter="Contains" ItemsPerRequest="100"
MarkFirstMatch="true" Width="380px" EnableAutomaticLoadOnDemand="True" EmptyMessage="-emp name-" ShowMoreResultsBox="True" AutoPostBack="True">
</telerik:RadComboBox>

Telerikのドキュメントによると

データ ソースを RadComboBox に設定します。これを行うには、DataSourceID または DataSource プロパティを使用し、DataTextField および DataValueField プロパティをデータ ソースのそれぞれのフィールドに設定します。(DataSource を使用する場合は、ポストバックごとにプロパティを設定する必要があることに注意してください。最も便利なのは Page_Init です。) EnableAutomaticLoadOnDemand を true に設定します。


 protected void BindEmployees()
        {

            rad_ddl_inner_emp_name.Items.Clear();
            rad_ddl_inner_emp_name.DataSource = Utilities.GetAllEmployees();
            rad_ddl_inner_emp_name.DataTextField = "name";
            rad_ddl_inner_emp_name.DataValueField = "emp_num";
            rad_ddl_inner_emp_name.DataBind();

        }

 protected void Page_Init(object sender, EventArgs e)
        {
            BindEmployees();
        }

 protected void txt_inner_emp_num_TextChanged(object sender, EventArgs e)
        {
            rad_ddl_inner_emp_name.ClearSelection();
            rad_ddl_inner_emp_name.Items.FindItemByValue(txt_inner_emp_num.Text.TrimEnd()).Selected = true;//Get exception here Object reference not set to an instance of an object.
        }

見つけたrad_ddl_inner_emp_name.Items.Count = 0!! 選択を設定する前に!この問題を解決するには?

4

4 に答える 4

4

ご存知のとおり、radcomboxの先行入力機能は、値ではなくクライアント側の対話を介してテキストを検索します。そのため、値を見つけることができません。

私が提案するのは、emp_numで検索するセカンダリオブジェクトを用意することです(これが常にテキストボックスに入力される値であると想定しています)。

たとえば、グローバル変数を作成します。

private Dictionary<string, string> Emp_Dict = new Dictionary<string, string>(); 

次に、バインディングを行うときにこの辞書にデータを入力します。次のコードは、無数の型が返されることを前提としています。そうでない場合は、辞書に別の方法でデータを入力する必要があります。また、これを機能させるには、(System.Linq)を含める必要があります。

    var dataSource = Utilities.GetAllEmployees();
    Emp_Dict = dataSource.ToDictionary(ex => ex.emp_num, ex => ex.name);
    rad_ddl_inner_emp_name.Items.Clear();
    rad_ddl_inner_emp_name.DataSource = dataSource;
    rad_ddl_inner_emp_name.DataTextField = "name";
    rad_ddl_inner_emp_name.DataValueField = "emp_num";
    rad_ddl_inner_emp_name.DataBind();

したがって、テキスト変更イベントで辞書を使用する必要があります。

protected void txt_inner_emp_num_TextChanged(object sender, EventArgs e)
{
    rad_ddl_inner_emp_name.ClearSelection();
    if (Emp_Dict.ContainsKey(txt_inner_emp_num.Text.TrimEnd()))
    {
        rad_ddl_inner_emp_name.SelectedValue = txt_inner_emp_num.Text.TrimEnd();
        rad_ddl_inner_emp_name.Text = Emp_Dict[txt_inner_emp_num.Text.TrimEnd()];
    }

}

これで、テキストボックス内のテキストが変更されると、有効なemp_numがテキストボックスに入力されたときにradcomboboxが更新されます。

于 2013-03-12T12:45:58.787 に答える
2

問題は、アイテムがリクエストされたときにのみロードされることです!

設定

EnableAutomaticLoadOnDemand="False"

そしてそれはうまくいくでしょう!

アップデート:

LoadOnDemand を使用する場合は、これら 2 つのプロパティを設定し、EnableAutomicLoadOnDemand! を削除します。

EnableLoadOnDemand="True"
EnableItemCaching="True"

更新 2: ItemCaching を有効にする必要はありませんが、害はありません!

于 2013-03-05T13:10:16.730 に答える
1

ビューステートを無効にしない限り、ポストバックごとにデータをRadComboBoxにバインドする必要はありません。

Filter、MarkFirstMatch、およびEnableAutomaticLoadOnDemandは、すべての従業員を自分でロードしているため、この場合は役に立ちません。

LoadOnDemandは基本的に、ユーザーがComboBox内で入力を開始すると、ComboBoxはItemsRequestedイベントを発生させ、ajaxを介してデータを取得します。

<asp:TextBox ID="txt_inner_emp_num" runat="server" Width="60px" 
ontextchanged="txt_inner_emp_num_TextChanged" AutoPostBack="true" />

<telerik:RadComboBox ID="rad_ddl_inner_emp_name" runat="server" 
   CausesValidation="False" Culture="ar-EG">
</telerik:RadComboBox>

protected void Page_Init(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        rad_ddl_inner_emp_name.DataSource = Utilities.GetAllEmployees();
        rad_ddl_inner_emp_name.DataTextField = "name";
        rad_ddl_inner_emp_name.DataValueField = "emp_num";
        rad_ddl_inner_emp_name.DataBind();
    }
}
protected void txt_inner_emp_num_TextChanged(object sender, EventArgs e)
{
    string value = txt_inner_emp_num.Text;
    if(!string.IsNullOrWhiteSpace(value))
    {
        value = value.Trim();
        if (rad_ddl_inner_emp_name.Items
            .FindItemByValue(txt_inner_emp_num.Text.Trim()) != null)
            rad_ddl_inner_emp_name.SelectedValue = value;
    }
}
于 2013-03-05T18:40:27.077 に答える
1

アイテムがないため、ddl で選択済みとしてrad_ddl_inner_emp_name.Items設定できます。txt_inner_emp_num.Text

まずrad_ddl_inner_emp_name.Items count > 0、目的のテキストを選択してから設定するかどうかを確認します。または、rad_ddl_inner_emp_name.Items.FindItemByValue(txt_inner_emp_num.Text.TrimEnd())null でないかどうかを確認できます。

于 2013-03-05T13:04:25.900 に答える