gridview中textbox的内容被修改后,需要鼠标点击两次才能到下一个控件

时间:2021-10-01 16:58:39
gridview中textbox的内容被修改后,需要鼠标点击两次才能到下一个控件,
怎么解决这个问题
因为我在gridview的RowDataBound中添加了行click时,变色事件
protected void gwData_RowDataBound(object sender, GridViewRowEventArgs e)
    {      
        RadioButton rdb = (RadioButton)e.Row.Cells[0].FindControl("RadioButton1");
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            //選択時、色設定
            Button btnHiddenPostButton = e.Row.FindControl("btnHiddenPostButton") as Button;
            if (btnHiddenPostButton != null)
            {
                e.Row.Attributes.Add("onmouseover", "if(this!=prevselitem){this.style.backgroundColor='red'}");
                e.Row.Attributes.Add("onmouseout", "if(this!=prevselitem){this.style.backgroundColor='#ffffff'}");
                e.Row.Attributes.Add("onclick", "selectColor(this);");
                //単選
                rdb.Attributes.Add("onclick", "setRadio(this)");
            }
        }
    }


<asp:GridView ID="gwData" runat="server" AutoGenerateColumns="False" Height="224px"
                                        Width="100%" OnRowDataBound="gwData_RowDataBound" BackColor="White" BorderColor="#3366CC"
                                        BorderStyle="None" BorderWidth="1px" CellPadding="4" 
                                        GridLines="Horizontal" >
                                        <Columns>
                                            <asp:TemplateField>
                                                <ItemTemplate>
                                                    <input type="hidden" name="DataId" value="<%#Eval("id") %>" />
                                                </ItemTemplate>
                                            </asp:TemplateField>
                                            <asp:TemplateField HeaderText="101_dg_007">
                                                <ItemTemplate>
                                                    <asp:TextBox ID="tName" runat="server" Text='<%# Bind("name") %>' OnTextChanged="tName_TextChanged"
                                                        AutoPostBack="true"></asp:TextBox>
                                                </ItemTemplate>
                                            </asp:TemplateField>
                                            <asp:TemplateField HeaderText="101_dg_008">
                                                <ItemTemplate>
                                                    <asp:TextBox ID="tComdata" runat="server" Text='<%# Bind("comdata") %>' OnTextChanged="tComdata_TextChanged"
                                                        AutoPostBack="true"></asp:TextBox>
                                                </ItemTemplate>
                                            </asp:TemplateField>
                                            <asp:TemplateField HeaderText="101_dg_009">
                                                <ItemTemplate>
                                                    <asp:RadioButton ID="RadioButton1" runat="server" AutoPostBack="true" OnCheckedChanged="RadioButton1_CheckedChanged" />
                                                </ItemTemplate>
                                            </asp:TemplateField>
                                            <asp:TemplateField HeaderText="101_dg_009" Visible="false">
                                                <ItemTemplate>
                                                    <asp:Label ID="lDefuser" runat="server" Text='<%# Bind("default_use") %>'></asp:Label>
                                                </ItemTemplate>
                                            </asp:TemplateField>
                                            <asp:TemplateField HeaderText="sort" Visible="false">
                                                <ItemTemplate>
                                                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("sort") %>'></asp:Label>
                                                </ItemTemplate>
                                            </asp:TemplateField>
                                            <asp:TemplateField ShowHeader="False" HeaderStyle-CssClass="buttonHidden" ItemStyle-CssClass="buttonHidden">
                                                <ItemTemplate>
                                                    <asp:Button ID="btnHiddenPostButton" CommandName="HiddenPostButtonCommand" runat="server"
                                                        Text="HiddenPostButton" CommandArgument='<%# Container.DataItemIndex %>' Width="0px"
                                                        CssClass="buttonHidden" />
                                                </ItemTemplate>
                                                <HeaderStyle CssClass="buttonHidden" />
                                                <ItemStyle CssClass="buttonHidden" />
                                            </asp:TemplateField>
                                        </Columns>
                                        <HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" HorizontalAlign="Center" />
                                        <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
                                        <RowStyle BackColor="White" HorizontalAlign="Center" />
                                        <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
                                        <SortedAscendingCellStyle BackColor="#F1F1F1" />
                                        <SortedAscendingHeaderStyle BackColor="#0000A9" />
                                        <SortedDescendingHeaderStyle BackColor="#000065" />
                                    </asp:GridView>
现在出现,画面textbox修改值后,需要鼠标点两下才能到其他控件

13 个解决方案

#1


@insus    高手在不

#2


哪位高手在线,帮我看看

#3


postback了。

#4


引用 3 楼 insus 的回复:
postback了。


autopostback  去掉?

#5


引用 3 楼 insus 的回复:
postback了。

AutoPostBack去掉的情况,改变gridview中的textbox值不触发textchange事件,只有点击gridview外按钮是才触发textchange,而且是一次触发4回

#6


高手们快来帮助一下 gridview中textbox的内容被修改后,需要鼠标点击两次才能到下一个控件

#7


引用 5 楼 rabbit0310 的回复:
Quote: 引用 3 楼 insus 的回复:

postback了。

AutoPostBack去掉的情况,改变gridview中的textbox值不触发textchange事件,只有点击gridview外按钮是才触发textchange,而且是一次触发4回


3楼的意思不是让你去掉AutoPostBack,那个只控制单体回发,现在感觉是你事件重复加载了,也就是postback了,加个
if (!IsPostBack)
            {
                //你的方法
            }
应该就可以了

#8


引用 7 楼 u014083627 的回复:
Quote: 引用 5 楼 rabbit0310 的回复:

Quote: 引用 3 楼 insus 的回复:

postback了。

AutoPostBack去掉的情况,改变gridview中的textbox值不触发textchange事件,只有点击gridview外按钮是才触发textchange,而且是一次触发4回


3楼的意思不是让你去掉AutoPostBack,那个只控制单体回发,现在感觉是你事件重复加载了,也就是postback了,加个
if (!IsPostBack)
            {
                //你的方法
            }
应该就可以了


额,但是我是要调后台的textchange方法  怎么能在(!IsPostBack)  这里面写

#9


会不会是因为我给row加了click事件,我加click事件是为了给行加颜色

#10


在给行设置颜色的js中
var prevselitem = null;
        var currentIndex = 1;
        function selectColor(row) {
            currentIndex = row.rowIndex;
            if (prevselitem != null) {
                prevselitem.style.backgroundColor = '#ffffff';
            }
            row.style.backgroundColor = 'orange';
            prevselitem = row;
            document.getElementById('<%=tID.ClientID%>').value = currentIndex - 1;
        }


我隐藏的textbox绑的选中的行号,

后台通过隐藏的text进行修改值
    protected void tName_TextChanged(object sender, EventArgs e)
    {
        TextBox tbName = (sender as TextBox);
        DataTable dataTable = (DataTable)Session["dtList"];
        dataTable.Rows[int.Parse(tID.Text)]["name"] = tbName.Text;
        Session["dtList"] = dataTable;
    }

#11


看到了,你的xxx_TextChanged事件,不能写在OnRowDataBound事件中,而是在OnRowCreated。

onRowDataBound事件,是每触发一次,执行一次,而OnRowCreated只会在Gridivew第一次加载时,运行一次。

#12


参考这篇:
http://www.cnblogs.com/insus/p/3794491.html

有一点要注意。每个文本框输入完之后,需要按回车。
这样用户再去点击某一文本框时,就不必点两次了。

#13


文本框内容需要验证的话,最好用前台控件验证
而不是每输入一个字母就postback一次

#1


@insus    高手在不

#2


哪位高手在线,帮我看看

#3


postback了。

#4


引用 3 楼 insus 的回复:
postback了。


autopostback  去掉?

#5


引用 3 楼 insus 的回复:
postback了。

AutoPostBack去掉的情况,改变gridview中的textbox值不触发textchange事件,只有点击gridview外按钮是才触发textchange,而且是一次触发4回

#6


高手们快来帮助一下 gridview中textbox的内容被修改后,需要鼠标点击两次才能到下一个控件

#7


引用 5 楼 rabbit0310 的回复:
Quote: 引用 3 楼 insus 的回复:

postback了。

AutoPostBack去掉的情况,改变gridview中的textbox值不触发textchange事件,只有点击gridview外按钮是才触发textchange,而且是一次触发4回


3楼的意思不是让你去掉AutoPostBack,那个只控制单体回发,现在感觉是你事件重复加载了,也就是postback了,加个
if (!IsPostBack)
            {
                //你的方法
            }
应该就可以了

#8


引用 7 楼 u014083627 的回复:
Quote: 引用 5 楼 rabbit0310 的回复:

Quote: 引用 3 楼 insus 的回复:

postback了。

AutoPostBack去掉的情况,改变gridview中的textbox值不触发textchange事件,只有点击gridview外按钮是才触发textchange,而且是一次触发4回


3楼的意思不是让你去掉AutoPostBack,那个只控制单体回发,现在感觉是你事件重复加载了,也就是postback了,加个
if (!IsPostBack)
            {
                //你的方法
            }
应该就可以了


额,但是我是要调后台的textchange方法  怎么能在(!IsPostBack)  这里面写

#9


会不会是因为我给row加了click事件,我加click事件是为了给行加颜色

#10


在给行设置颜色的js中
var prevselitem = null;
        var currentIndex = 1;
        function selectColor(row) {
            currentIndex = row.rowIndex;
            if (prevselitem != null) {
                prevselitem.style.backgroundColor = '#ffffff';
            }
            row.style.backgroundColor = 'orange';
            prevselitem = row;
            document.getElementById('<%=tID.ClientID%>').value = currentIndex - 1;
        }


我隐藏的textbox绑的选中的行号,

后台通过隐藏的text进行修改值
    protected void tName_TextChanged(object sender, EventArgs e)
    {
        TextBox tbName = (sender as TextBox);
        DataTable dataTable = (DataTable)Session["dtList"];
        dataTable.Rows[int.Parse(tID.Text)]["name"] = tbName.Text;
        Session["dtList"] = dataTable;
    }

#11


看到了,你的xxx_TextChanged事件,不能写在OnRowDataBound事件中,而是在OnRowCreated。

onRowDataBound事件,是每触发一次,执行一次,而OnRowCreated只会在Gridivew第一次加载时,运行一次。

#12


参考这篇:
http://www.cnblogs.com/insus/p/3794491.html

有一点要注意。每个文本框输入完之后,需要按回车。
这样用户再去点击某一文本框时,就不必点两次了。

#13


文本框内容需要验证的话,最好用前台控件验证
而不是每输入一个字母就postback一次