datagrid добавить элемент в источник данных потерять viewstate - PullRequest
1 голос
/ 17 июля 2009

У меня есть страница с TextBox, кнопкой и сеткой данных.

Цель здесь проста: каждый раз, когда я вводю что-то в 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; }
}

Так что я думаю, что прямой вопрос будет таким: Как добавить элементы в сетку и бизнес-объект, не теряя при этом выбор радиобоксов в сетке.

Ответы [ 2 ]

2 голосов
/ 17 июля 2009

Вам нужно сохранить состояние радиобоксов в вашем бизнес-объекте до добавления нового элемента в Список, чтобы при повторном его связывании варианты отражались обратно в DataGrid.
Если вы делаете это, вы можете также отключить ViewState для сетки ...

0 голосов
/ 17 июля 2009

Ваша 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 и задаете его для элемента в вашем списке .

 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 с и, следовательно, множество RadioButton с таким же идентификатором "регистр". Вот почему вы не можете получить к нему из-за кода.

Это сохранит состояние RadioButton s. Надеюсь, это поможет вам.

...