asp.net repeater按钮点击事件,DataItem是否为null?

ff29svar  于 2023-05-19  发布在  .NET
关注(0)|答案(1)|浏览(152)

嗨,只是想得到一个按钮点击事件,从它被按下的特定行发送数据到点击事件本身,这样我就可以把它放到一个URL上,并把它发送到另一个页面,但数据项是空的。
我会提供代码。中继器btw是绑定正确的条款,我可以看到正确的数据对它之前,我按下按钮。
我已经尝试在按钮单击事件中重新绑定中继器,因为我注意到当我按下按钮时,它正在点击页面加载。
我asp.net有一段时间没有做www.example.com了,所以我有点生疏了。
'''

<asp:Repeater  ID ="DealerContactsRepeater" runat ="server">
         <HeaderTemplate>
        <table ID ="ContactsTable">
            <tr>
                <th></th>
                <th style="display:none;">Dealer Contact ID</th>
                <th>Title</th>
                <th>Fullname</th>
                <th>Is Preferred Contact?</th>
                <th>Position</th>               
                <th style="display:none;">Forename</th>
                <th style="display:none;">Surname</th>
                <th>Phone</th>
                <th style="display:none;">Direct</th>
                <th style="display:none;">Fax</th>
                <th>Mobile</th>
                <th>Email</th>
                <th style="display:none;">Secondary Email</th>
                
            </tr>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td> <asp:Button ID="btnEdit" runat="server" Text="Edit" OnClick="btnEdit_Click" CommandArgument='<%# Container.ItemIndex %>' /></td>
            <td style="display:none;"><%# Eval("DealerContactId") %></td>
            <td><%# GetTitleText((byte)Eval("NameTitleId")) %></td>
            <td><%# Eval("Forename") %> <%# Eval("Surname") %></td>
             <td><asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Eval("DecisionMaker") %>' Enabled="false" /></td>
            <td><%# GetPositionText((byte)Eval("DealerContactPositionId")) %></td>
            <td style="display:none;"><%# Eval("Forename") %></td>
            <td style="display:none;"><%# Eval("Surname") %></td>
            <td><%# Eval("PhoneNumber") %></td>
            <td style="display:none;"><%# Eval("DirectDialNumber") %></td>
            <td style="display:none;"><%# Eval("FaxNumber") %></td>
            <td><%# Eval("MobileNumber") %></td>
            <td><%# Eval("EmailAddress") %></td>
            <td style="display:none;""><%# Eval("SecondaryEmail") %></td>
        </tr>
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
    </asp:Repeater>

“”protected void Page_Load(object sender,EventArgs e){ if(!String getString();}

}

        private void BindContactsRepeater()
        {
            DealerContactsRepeater.DataSource = GetDealerContactInfo();
            DealerContactsRepeater.DataBind();
        }

'''按钮点击事件:

protected void btnEdit_Click(object sender, EventArgs e)
        {
            Button btnEdit = (Button)sender;
            RepeaterItem item = (RepeaterItem)btnEdit.NamingContainer;

            try
            {
                
                DataRowView row = (DataRowView)item.DataItem;
                int dealerContactId = Convert.ToInt32(row["DealerContactId"]);
                ContactTitles title = (ContactTitles)Enum.Parse(typeof(ContactTitles), row["NameTitleId"].ToString());
                bool isChecked = Convert.ToBoolean(row["DecisionMaker"]);
                ContactPositions position = (ContactPositions)Enum.Parse(typeof(ContactPositions), row["DealerContactPositionId"].ToString());
                string forename = row["Forename"].ToString();
                string surname = row["Surname"].ToString();
                string phone = row["PhoneNumber"].ToString();
                string direct = row["DirectDialNumber"].ToString();
                string fax = row["FaxNumber"].ToString();
                string mobile = row["MobileNumber"].ToString();
                string email = row["EmailAddress"].ToString();
                string secondEmail = row["SecondaryEmail"].ToString();

                string editUrl = $"EditPage.aspx?dealerContactId={dealerContactId}&title={(int)title}&isChecked={isChecked}&position={(int)position}&forename={Uri.EscapeDataString(forename)}&surname={Uri.EscapeDataString(surname)}&phone={Uri.EscapeDataString(phone)}&direct={Uri.EscapeDataString(direct)}&fax={Uri.EscapeDataString(fax)}&mobile={Uri.EscapeDataString(mobile)}&email={Uri.EscapeDataString(email)}&secondEmail={Uri.EscapeDataString(secondEmail)}";

                Response.Redirect(editUrl);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

'''
任何帮助将不胜感激。

egdjgwm8

egdjgwm81#

不幸的是,与桌面不同,数据绑定行在绑定完成后不可用。但是,在数据绑定事件期间它是可用的。
这个“事实”往往可以很好地利用,因为在行数据绑定事件上,那么所有行的数据源都可以使用。因此,税务计算,或隐藏/显示或任何可以在该事件中做的事情。
但是,一旦绑定完成,数据项源就消失了,并且超出了范围。
所以,为了一个简单的按钮点击?
如果您需要这些信息(重复项中不存在的行或数据),那么您必须重新提取数据。
如果数据行不多,那么另一种方法可以是将数据源保存在session()中,或者可能是viewstate中。
Viewstate很不错,因为它是“每一个网页”,如果一个用户有2个相同的页面在同一时间打开,那么它就会工作。但是,viewstate会随网页一起移动,并且会增加任何按钮点击的大小(viewstate包含在回发中,它会导致性能问题)。
Session()是100%服务器端的,但是每个用户的,而不是每个页面的-所以在这里要注意,因为这可能会阻止用户打开两个浏览器页面到同一个URL。
中继器缺少的另一个大特征当然是“数据密钥”。数据键真的很好,因为该功能可以为您“管理”数据库行PK id,但您永远不必向客户端网页和标记公开PK id值。出于这个原因,我经常避免使用中继器。
那么,那么:

DataRowView row = (DataRowView)item.DataItem;

不,你不能用一个按钮点击。你可以在数据绑定期间执行上述操作,比如我提到的行数据绑定事件。
因此,这建议您:
重新提取数据或持久化数据源。
但是,数据的重新提取?嗯,你也没有数据密钥(对于中继器!!)。您可以为listview,gridview。
所以,我咬紧牙关,冒更少的安全风险,我经常说会这样做:

<ItemTemplate>

                <h3><%# Eval("HotelName") %> </h3>

                <asp:Button ID="cmdView" runat="server" Text="View"
                    CommandArgument="<%# Eval("ID") %>"
                    OnClick="cmdView_Click"
                    />

所以,对于按钮点击代码,我可以这样做:

protected void cmdView_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        RepeaterItem rRow = (RepeaterItem)btn.NamingContainer;
        int MyRowIndex = rRow.ItemIndex;
        int MyPK = Convert.ToInt32(btn.CommandArgument);

        // use find control on rRow to get controls from this row.

        Label lFirstName = (Label)rRow.FindControl("FirstName");
        Debug.Print("First Name = " + lFirstName.Text);

    }

所以,请注意我们如何自由地获取/抓取中继器行,并自由地抓取控件+来自这些控件的值。
但是,如上所述,数据绑定源将超出范围。
如果我们的数据源被持久化到会话中,那么我可以这样做:

DataTable rstData = (DataTable)Session["rstData"];

        DataRow MyDataRow = rstData.Rows[MyRowIndex];
        Debug.Print($"Tax rate = {MyDataRow["TaxRate"].ToString()}");

所以,你可以将你的数据对象(GetDealerContactInfo())推入session或viewstate,并按上面的行索引拉出。

相关问题