1

我确实有一个包含 TextBox、Button 和 Datagrid 的页面。

这里的目标很简单:每次我在 TextBox 中输入内容并按下按钮时,它都会进行一些检查,然后将该项添加到数据网格和业务逻辑数据源中。

问题是,如果我想让该项目出现在 DataGrid 中,我必须执行 datagrid.DataSource = myBusinessObject; 数据网格.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 类更改为保存布尔值而不是字符串。现在我将 CanRegister 设置为始终为真,您可以稍后更改逻辑。

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;
                }
            }

        }

您必须执行所有这些操作的原因是因为您的RadioButtonItemTemplate的一部分并绑定到DataGrid,这意味着可能会有许多DataGridItem,因此会有许多具有相同 id“注册”的RadioButton 。这就是为什么您无法从代码隐藏中获取它的原因。

这将保留RadioButton的状态。希望这对您有所帮助。

于 2009-07-17T15:28:10.197 回答