关于gridview某一行根据行内某一列值改变而动态改变的问题

时间:2021-04-24 15:03:46
最近工作中有这样的需求
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" EnableModelValidation="True"
                OnRowCommand="GridView1_RowCommand" 
                OnRowDataBound="GridView1_RowDataBound" 
               >
                <Columns>
                                       <asp:TemplateField HeaderText="类型">
                        <ItemTemplate>
                            <asp:DropDownList ID="TravelType" runat="server" Width="100px" OnSelectedIndexChanged="TravelType_SelectedIndexChanged" >
<asp:ListItem Value="0">A</asp:ListItem>
                            <asp:ListItem Value="1">B</asp:ListItem>
                            </asp:DropDownList>

                        </ItemTemplate> 
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="起点">
                        <ItemTemplate>
                            <asp:TextBox ID="start" runat="server" Text='<%# Eval("起点") %>' ></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>
                      <asp:TemplateField HeaderText="终点">
                        <ItemTemplate>
                            <asp:TextBox ID="end" runat="server" Text='<%# Eval("终点") %>'></asp:TextBox>

                        </ItemTemplate>
                    </asp:TemplateField>
                                   </Columns>
                <RowStyle Height="40px" />
                <HeaderStyle Height="40px" />
                <FooterStyle Height="40px" />
            </asp:GridView>
例如这样的一个gridview 当我选择某一行的类型列dropdownlist的时候 我希望根据选择的值不同,例如选择了A让同一行的起点列内的textbox禁用,选择B让同一行的终点列内的textbox禁用,这样请问该如何实现,前端或后台的实现都可以。
在后台可以在GridView1_RowDataBound方法内根据dropdownlist选中值的不同做更改其他列的操作,可是dropdownlist的postback不会触发该方法。
前台我试过循环绑定,不过好像添加不了onchange事件,或者哪里写错了。希望各位大大指点下。

10 个解决方案

#1


引用 楼主 w308099678 的回复:
最近工作中有这样的需求
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" EnableModelValidation="True"
                OnRowCommand="GridView1_RowCommand" 
                OnRowDataBound="GridView1_RowDataBound" 
               >
                <Columns>
                                       <asp:TemplateField HeaderText="类型">
                        <ItemTemplate>
                            <asp:DropDownList ID="TravelType" runat="server" Width="100px" OnSelectedIndexChanged="TravelType_SelectedIndexChanged" >
<asp:ListItem Value="0">A</asp:ListItem>
                            <asp:ListItem Value="1">B</asp:ListItem>
                            </asp:DropDownList>

                        </ItemTemplate> 
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="起点">
                        <ItemTemplate>
                            <asp:TextBox ID="start" runat="server" Text='<%# Eval("起点") %>' ></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>
                      <asp:TemplateField HeaderText="终点">
                        <ItemTemplate>
                            <asp:TextBox ID="end" runat="server" Text='<%# Eval("终点") %>'></asp:TextBox>

                        </ItemTemplate>
                    </asp:TemplateField>
                                   </Columns>
                <RowStyle Height="40px" />
                <HeaderStyle Height="40px" />
                <FooterStyle Height="40px" />
            </asp:GridView>
例如这样的一个gridview 当我选择某一行的类型列dropdownlist的时候 我希望根据选择的值不同,例如选择了A让同一行的起点列内的textbox禁用,选择B让同一行的终点列内的textbox禁用,这样请问该如何实现,前端或后台的实现都可以。
在后台可以在GridView1_RowDataBound方法内根据dropdownlist选中值的不同做更改其他列的操作,可是dropdownlist的postback不会触发该方法。
前台我试过循环绑定,不过好像添加不了onchange事件,或者哪里写错了。希望各位大大指点下。


里面的下拉选择禁用,同一行的按钮就禁用么?
这个意思?

#2


用JS写啊,很简单的!不懂问我!

#3


意思就是下拉选择某个值 同一行的其他列根据这个值的不同做不同的操作 例如下拉选择A 起点和终点内的textbox禁用
回楼上 JS该怎么写 我写了不行

 

#4



$("#TravelType").change(function(){
    //获取选中值
    //禁用对应的textbox
});

#5


回楼上的 里面禁用对应的textbox该怎么写呢 写 $("#start") $("#end")应该是不行的对吧 怎么能找出对应这一行的 #start与#end呢。感谢。。

#6



$("#GridView1 select").change(function () {
    $(this).parent().next().find("input")[0].value = this.value;
    $(this).parent().next().next().find("input")[0].value = this.options[this.selectedIndex].text;
});

这个例子是赋值,当然你也可以修改属性。

#7


$("#TravelType").change(function(){alert("a")}); 
刚试了下 这样写好像绑定不到onchange事件 alert不到东西 用F12查看也没有onchange属性

#8


换个事件,after

#9


前台先加: 

<asp:DropDownList ID="TravelType" runat="server" Width="100px" OnSelectedIndexChanged="TravelType_SelectedIndexChanged"  AutoPostBack="True"  >
后台:


 protected void TravelType_SelectedIndexChanged(object sender, EventArgs e)
    {
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            StringBuilder query = new StringBuilder();
            GridViewRow row = GridView1.Rows[i];
        
            TextBox empRealName = ((TextBox)row.Cells[0].FindControl("start"));
             if (((DropDownList)row.Cells[0].FindControl("TravelType")).SelectedValue == "A")
            {

                empRealName.Enabled = false;
            }          
        }
    }



 

#10


引用 9 楼 z_dota 的回复:
前台先加: 

<asp:DropDownList ID="TravelType" runat="server" Width="100px" OnSelectedIndexChanged="TravelType_SelectedIndexChanged"  AutoPostBack="True"  >
后台:


 protected void TravelType_SelectedIndexChanged(object sender, EventArgs e)
    {
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            StringBuilder query = new StringBuilder();
            GridViewRow row = GridView1.Rows[i];
        
            TextBox empRealName = ((TextBox)row.Cells[0].FindControl("start"));
             if (((DropDownList)row.Cells[0].FindControl("TravelType")).SelectedValue == "A")
            {

                empRealName.Enabled = false;
            }          
        }
    }



 

感谢您 这个方法有效

#1


引用 楼主 w308099678 的回复:
最近工作中有这样的需求
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" EnableModelValidation="True"
                OnRowCommand="GridView1_RowCommand" 
                OnRowDataBound="GridView1_RowDataBound" 
               >
                <Columns>
                                       <asp:TemplateField HeaderText="类型">
                        <ItemTemplate>
                            <asp:DropDownList ID="TravelType" runat="server" Width="100px" OnSelectedIndexChanged="TravelType_SelectedIndexChanged" >
<asp:ListItem Value="0">A</asp:ListItem>
                            <asp:ListItem Value="1">B</asp:ListItem>
                            </asp:DropDownList>

                        </ItemTemplate> 
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="起点">
                        <ItemTemplate>
                            <asp:TextBox ID="start" runat="server" Text='<%# Eval("起点") %>' ></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>
                      <asp:TemplateField HeaderText="终点">
                        <ItemTemplate>
                            <asp:TextBox ID="end" runat="server" Text='<%# Eval("终点") %>'></asp:TextBox>

                        </ItemTemplate>
                    </asp:TemplateField>
                                   </Columns>
                <RowStyle Height="40px" />
                <HeaderStyle Height="40px" />
                <FooterStyle Height="40px" />
            </asp:GridView>
例如这样的一个gridview 当我选择某一行的类型列dropdownlist的时候 我希望根据选择的值不同,例如选择了A让同一行的起点列内的textbox禁用,选择B让同一行的终点列内的textbox禁用,这样请问该如何实现,前端或后台的实现都可以。
在后台可以在GridView1_RowDataBound方法内根据dropdownlist选中值的不同做更改其他列的操作,可是dropdownlist的postback不会触发该方法。
前台我试过循环绑定,不过好像添加不了onchange事件,或者哪里写错了。希望各位大大指点下。


里面的下拉选择禁用,同一行的按钮就禁用么?
这个意思?

#2


用JS写啊,很简单的!不懂问我!

#3


意思就是下拉选择某个值 同一行的其他列根据这个值的不同做不同的操作 例如下拉选择A 起点和终点内的textbox禁用
回楼上 JS该怎么写 我写了不行

 

#4



$("#TravelType").change(function(){
    //获取选中值
    //禁用对应的textbox
});

#5


回楼上的 里面禁用对应的textbox该怎么写呢 写 $("#start") $("#end")应该是不行的对吧 怎么能找出对应这一行的 #start与#end呢。感谢。。

#6



$("#GridView1 select").change(function () {
    $(this).parent().next().find("input")[0].value = this.value;
    $(this).parent().next().next().find("input")[0].value = this.options[this.selectedIndex].text;
});

这个例子是赋值,当然你也可以修改属性。

#7


$("#TravelType").change(function(){alert("a")}); 
刚试了下 这样写好像绑定不到onchange事件 alert不到东西 用F12查看也没有onchange属性

#8


换个事件,after

#9


前台先加: 

<asp:DropDownList ID="TravelType" runat="server" Width="100px" OnSelectedIndexChanged="TravelType_SelectedIndexChanged"  AutoPostBack="True"  >
后台:


 protected void TravelType_SelectedIndexChanged(object sender, EventArgs e)
    {
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            StringBuilder query = new StringBuilder();
            GridViewRow row = GridView1.Rows[i];
        
            TextBox empRealName = ((TextBox)row.Cells[0].FindControl("start"));
             if (((DropDownList)row.Cells[0].FindControl("TravelType")).SelectedValue == "A")
            {

                empRealName.Enabled = false;
            }          
        }
    }



 

#10


引用 9 楼 z_dota 的回复:
前台先加: 

<asp:DropDownList ID="TravelType" runat="server" Width="100px" OnSelectedIndexChanged="TravelType_SelectedIndexChanged"  AutoPostBack="True"  >
后台:


 protected void TravelType_SelectedIndexChanged(object sender, EventArgs e)
    {
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            StringBuilder query = new StringBuilder();
            GridViewRow row = GridView1.Rows[i];
        
            TextBox empRealName = ((TextBox)row.Cells[0].FindControl("start"));
             if (((DropDownList)row.Cells[0].FindControl("TravelType")).SelectedValue == "A")
            {

                empRealName.Enabled = false;
            }          
        }
    }



 

感谢您 这个方法有效