1

TextBox、Button、およびDatagridを含むページがあります。

ここでの目標は単純です。TextBoxに何かを入力してボタンを押すたびに、少しチェックしてから、データグリッドとビジネスロジックデータソースにアイテムを追加します。

問題は、アイテムをDataGridに表示したい場合、datagrid.DataSource=myBusinessObject;を実行する必要があることです。datagrid.DataBind(); それに関する問題は、ユーザーが行ったビューステートとラジオボックスでの選択が失われることです。

これがテンプレートです:

            <asp:TextBox ID="txtDomain" runat="server" style="margin-bottom: 0px" 
                Width="254px"></asp:TextBox>
                &nbsp;<asp:Button ID="domainAdd" runat="server" onclick="domainAdd_Click" 
                style="height: 26px" Text="Ajouter" />
            &nbsp;<br />
            <br />
            <asp:DataGrid ID="dg1" runat="server" AutoGenerateColumns="false">
                <Columns>
                    <asp:BoundColumn DataField="Name" HeaderText="Nom choisi"></asp:BoundColumn>
                    <asp:TemplateColumn HeaderText="Enregistrer">
                        <ItemTemplate>
                            <asp:RadioButton ID="register" runat="server" GroupName="domaine_action" Checked='<%# Bind("IsRegister")%>' Enabled='<%# Bind("CanRegister")%>' />
                        </ItemTemplate>
                    </asp:TemplateColumn>
                    <asp:TemplateColumn HeaderText="Transférer">
                        <ItemTemplate>
                            <asp:RadioButton ID="transfert" runat="server" GroupName="domaine_action" Checked='<%# Bind("IsTransfert")%>' Enabled='<%# Bind("CanTransfert")%>' />
                        </ItemTemplate>
                    </asp:TemplateColumn>
                    <asp:TemplateColumn HeaderText="Gérer moi même">
                        <ItemTemplate>
                            <asp:RadioButton ID="manage" runat="server" GroupName="domaine_action" Checked='<%# Bind("IsSelfManaged")%>' Enabled='<%# Bind("CanSelfManage")%>' />
                        </ItemTemplate>
                    </asp:TemplateColumn>
                </Columns>
            </asp:DataGrid>

背後にあるコード:

    protected void domainAdd_Click(object sender, EventArgs e)
    {
        if (Session["dic"] != null)
        {
            var _dic = (List<Test1>)Session["dic"];

            _dic.Add(new Test1 { Name = txtDomain.Text });

            dg1.DataSource = _dic;
            dg1.DataBind();

            Session["dic"] = _dic;
        }
        else
        {
            List<Test1> _dic = new List<Test1>();

            _dic.Add(new Test1 { Name = txtDomain.Text });

            dg1.DataSource = _dic;
            dg1.DataBind();

            Session["dic"] = _dic;
        }

今のところ、Test1オブジェクトは、ビジネスロジックのフィールドをマップするための小さなクラスです。

public class Test1
{
    public string Name { get; set; }

    public string IsRegister { get; set; }
    public string IsTransfert { get; set; }
    public string IsSelfManaged { get; set; }

    public string CanRegister { get; set; }
    public string CanTransfert { get; set; }
    public string CanSelfManage { get; set; }
}

したがって、直接的な質問は、グリッド内のラジオボックスの選択肢を失うことなく、グリッドとビジネスオブジェクトにアイテムを追加する方法だと思います。

4

2 に答える 2

2

リストに新しいアイテムを追加する前に、ラジオボックスの状態をビジネス オブジェクトに保存する必要があります。これにより、再度バインドしたときに選択がデータグリッドに反映されます。
そうしている場合は、グリッドの ViewState を無効にすることもできます...

于 2009-07-17T15:32:27.037 に答える
0

DataGridはそのRadioButtonをTest1のプロパティにバインドするため、それに応じてそれらを設定すると、選択された選択肢が保持されません。

私は ASP .NET の専門家ではありません。私よりも賢い人が助けてくれることを願っていますが、誰も答えていないためです。やってみます。ラジオ ボタンはTest1.IsRegisterプロパティにバインドされています。つまり、その状態を維持するには、そのプロパティを true または false に設定する必要があります。最初に Test1 クラスを変更して、文字列ではなく bool を保持するようにします。ここでは、CanRegister を常に true に設定します。後でロジックを変更できます。

public class Test1
    {
        public string Name { get; set; }

        public bool IsRegister { get; set; }
        public bool IsTransfert { get; set; }
        public bool IsSelfManaged { get; set; }

        public bool CanRegister { get { return true; } }
        public bool CanTransfert { get { return true; } }
        public bool CanSelfManage { get { return true; } }
    }

ここで、誰かがRadioButtonを押すたびに保存する必要があるため、イベント ハンドラーを作成し、AutoPostBackを true に設定する必要があります。

<asp:RadioButton OnCheckedChanged="register_checked" AutoPostBack="true" ID="register" runat="server" GroupName="domaine_action" Checked='<%# Bind("IsRegister")%>' Enabled='<%# Bind("CanRegister")%>' />

これで、イベント ハンドラーregister_checked . これは、RadioButton.Checkedプロパティの値を取得し、それをListの項目に設定する部分です。

 protected void register_checked(object sender, EventArgs e)
        {
            //make sure you have a list
            if(Session["dic"] == null)
                return;

            List<Test1> _dic =  (List<Test1>)Session["dic"];
            RadioButton btn = sender as RadioButton;
            string btnClientId = btn.ClientID;

            //make sure cast didnt crash
            if (btn == null)
                return;

            foreach (DataGridItem control in dg1.Items)
            {
                //find the register RadioButton, ID="register"
                var item = control.FindControl("register");
                //make sure its the right RadioButton
                if (item.ClientID.Equals(btnClientId))
                {
                    //get the item index of this DataGridItem and take the appropriate object for List<Test1>
                    Test1 realItem = _dic[control.ItemIndex] as Test1;
                    if (realItem == null)
                        continue;

                    //set the Items IsRegister to the button value.
                    realItem.IsRegister = btn.Checked;
                }
            }

        }

これをすべて行う必要があるのは、RadioButtonがItemTemplateの一部であり、 DataGridにバインドされているためです。これは、多くのDataGridItemが存在する可能性があるため、同じ ID「登録」を持つ多くのRadioButtonが存在する可能性があることを意味します。これが、分離コードからアクセスできない理由です。

これにより、 RadioButtonの状態が保持されます。これがお役に立てば幸いです。

于 2009-07-17T15:28:10.197 に答える