I would place each of the 2 DropDownLists in their own individual UpdatePanels, and have the initial TextBox outside:
<asp:TextBox ID="tbLetterChoice" MaxLength="1" runat="server" AutoPostBack="true" OnTextChanged="ShowDropDown1Options" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="tbLetterChoice" EventName="TextChanged" />
</Triggers>
<ContentTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ShowDropDown2Options" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="DropDownList1" />
</Triggers>
<ContentTemplate>
<asp:DropDownList ID="DropDownList2" runat="server" AutoPostBack="true" OnSelectedIndexChanged="DoSomething" />
</ContentTemplate>
</asp:UpdatePanel>
there would need to be two small methods in the codebehind to populate the DropDownLists:
protected void ShowDropDown1Options(object sender, EventArgs e){
DropDownList1.Items.Clear();
// populate DropDownList1 based on tbLetterChoice.Text
}
protected void ShowDropDown2Options(object sender, EventArgs e){
DropDownList2.Items.Clear();
// populate DropDownList2 based on DropDownList1.SelectedValue
}
protected void DoSomething(object sender, EventArgs e){
// take action based on final choice from DropDownList2
}
So, user types a letter into 'tbLetterChoiceand' hits enter. This updates 'DropDownList1'. User chooses item from 'DropDownList1', and this populates 'DropDownList2'. User chooses item from 'DropDownList2', and program executes 'DoSomething()'.